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字段進行驗證,驗證步驟以下:工具