最近在对接第三方接口,对方采用的是一种不常见的传递参数方式,直接将参数转成json字符串{"param1":value1,"param2":value2},放在request body中进行传递,一般是key=value的传递形式,业务参数转成json后,也会有一个总参数json={"param1":value1,"param2":value2},或者是采用rest风格,直接在URI中api.example.com/test/{"param1":value1,"param2":value2},这样后台取值也就方便的多。java
HTTP中的两种传递参数的形式,一种就是采用key=value的格式进行传递,另外一个直接将数据放在body中进行传递,常见于传递json字符串或者xml数据流(微信公众号里就有采用传递XML数据的形式)等,第二种传递方式须要用POST方法,不然服务端将取不到数据。json
下面是采用request body形式传递参数的实例。api
public static void main(String[] args) { Map<String,String> map=new HashMap<String,String>(); map.put("param1", "1"); map.put("param2", "2"); map.put("param3", "3"); HttpClient client = HttpClients.createDefault(); HttpPost post = new HttpPost("http://127.0.0.1:8080/test/test"); try{ /*设置参数*/ post.setEntity(new StringEntity(JsonMapper.toJsonString(map), "UTF-8")); HttpResponse response = client.execute(post); HttpEntity entity=response.getEntity(); String returnMsg=EntityUtils.toString(entity,"UTF-8"); System.out.println(returnMsg); }catch (Exception e) { e.printStackTrace(); }finally{ /*释放连接*/ post.releaseConnection(); } }
客户端中须要把原先key=value参数传递形式换成String格式数据传递。微信
原先传参代码:app
Map<String,String> paramMap=new HashMap<String,String>(); List<NameValuePair> params = new ArrayList<NameValuePair>(); for(String key:paramMap.keySet()){ params.add(new BasicNameValuePair(key, paramMap.get(key))); } UrlEncodedFormEntity urlEncodedFormEntity=new UrlEncodedFormEntity(params,"UTF-8"); /*设置参数*/ post.setEntity(urlEncodedFormEntity);
如今传参代码:工具
Map<String,String> paramMap=new HashMap<String,String>(); /*设置参数*/ post.setEntity(new StringEntity(JsonMapper.toJsonString(paramMap), "UTF-8"));
@RequestMapping("/test") public Object Test(HttpServletRequest request){ InputStream inputStream=null; Reader input = null; Writer output = new StringWriter(); try { inputStream=request.getInputStream(); input = new InputStreamReader(inputStream); char[] buffer = new char[1024*4]; int n = 0; while(-1 != (n = input.read(buffer))) { output.write(buffer, 0, n); } System.out.println(output); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return "请求成功,服务端获取到的数据为:"+output.toString(); }