request body的传值与取值

前言

最近在对接第三方接口,对方采用的是一种不常见的传递参数方式,直接将参数转成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

实例说明

  1. 数据格式:JSON字符串
  2. 工具类:HttpClient
  3. 工具类版本:4.5
  4. 请求方法:POST

客户端实现

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();
}
相关文章
相关标签/搜索