easyopen定义了7个固定的参数,用json接收算法
{ "name":"goods.get", "version":"2.0", "app_key":"test", "data":"%7B%22goods_name%22%3A%22iphone6%22%7D", "format":"json", "timestamp":"2018-01-16 17:02:02", "sign":"4CB446DF67DB3637500D4715298CE4A3" }
其中sign须要使用双方约定的签名算法来生成。json
请求数据放在body体中,采用json格式。这里给出一个POST工具类:数组
public class PostUtil { private static final String UTF8 = "UTF-8"; private static final String CONTENT_TYPE_JSON = "application/json"; private static final String ACCEPT_LANGUAGE = "Accept-Language"; /** * POST请求 * @param url * @param params * @param lang 语言zh,en * @return * @throws Exception */ public static String post(String url, JSONObject params, String lang) throws Exception { String encode = UTF8; // 使用 POST 方式提交数据 PostMethod method = new PostMethod(url); try { String requestBody = params.toJSONString(); // 请求数据放在body体中,采用json格式 method.setRequestEntity(new StringRequestEntity(requestBody, CONTENT_TYPE_JSON, encode)); // 设置请求语言 method.setRequestHeader(ACCEPT_LANGUAGE, lang); HttpClient client = new HttpClient(); int state = client.executeMethod(method); // 返回的状态 if (state != HttpStatus.SC_OK) { throw new Exception("HttpStatus is " + state); } String response = method.getResponseBodyAsString(); return response; // response就是最后获得的结果 } catch (Exception e) { throw e; } finally { method.releaseConnection(); } } }
@Test public void testGet() throws Exception { Map<String, String> param = new HashMap<String, String>(); Goods goods = new Goods(); String data = JSON.toJSONString(goods); data = URLEncoder.encode(data, "UTF-8"); param.put("name", "hello"); param.put("app_key", appId); param.put("data", data); param.put("timestamp", getTime()); param.put("version", ""); param.put("format", "json"); String sign = ApiUtil.buildSign(param, secret); param.put("sign", sign); System.out.println("请求内容:" + JSON.toJSONString(param)); String resp = PostUtil.post(url, param,"zh"); System.out.println(resp); } public String getTime() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); }
签名算法描述以下:app
伪代码:iphone
Map<String,Object> paramsMap = new ...; // 参数 Set<String> keySet = paramsMap.keySet(); List<String> paramNames = new ArrayList<String>(keySet); // 1. Collections.sort(paramNames); StringBuilder paramNameValue = new StringBuilder(); // 2. for (String paramName : paramNames) { paramNameValue.append(paramName).append(paramsMap.get(paramName)); } // 3. String source = secret + paramNameValue.toString() + secret; // 4.& 5. String sign = md5(source); // 6. paramsMap.put("sign",sign);
服务端拿到请求数据后会sign字段进行验证,验证步骤以下:工具