使用RestTemplate发送post请求,入参是多层嵌套的JSON
本文展示了一个完整的调用示例,入参、返参均是多层嵌套的JSON。
入参json |
{
"parameter": {
"a": "a",
"b": "b",
"c": {
"c1": "c1",
"c2": "c2",
"c3":"c3"
}
}
}
能看出来吧,入参有:parameter、c、c1三层,是多层嵌套的。
返参json |
{
"parameter": {
"code": "0000",
"desc": "成功",
"result": [
{
"m": [],
"n": [
{
"n1": "123",
"n2": "456"
},
{
"n1": "789",
"n2": "678"
}
]
}
]
}
}
处理思路是:先判断code是否为‘0000’,如果是,则将result以String的格式返回给前端。
代码实现 |
//1、拼接入参
Map queryMap = new HashMap();
queryMap.put("c1", c1);
queryMap.put("c2", c2);
queryMap.put("c3", c3);
Map paramMap = new HashMap();
paramMap.put("a", a);
paramMap.put("b", b);
paramMap.put("c", queryMap);
Map paramResult = new HashMap();
paramResult.put("parameter", paramMap);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
headers.add("apiKey", apiKey);
HttpEntity < String > entity = new HttpEntity < > (paramResult.toString(), headers);
//2、请求
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.postForObject("url", entity, String.class);
//3、处理返参
JSONObject jsonObject = new JSONObject(response);
JSONObject parameter = jsonObject.getJSONObject("parameter");
Object state = parameter.get("code");
if(state.equals("0000"))
{
result = parameter.getString("result");
}
return result;
备注 |
1、postForObject和postForEntity的区别?
postForEntity返回的信息更多,包括状态码、响应头等信息。一般情况下使用postForObject即可。
postForObject的返回值就是上方的“返参JSON”,postForEntity的是如下,看起来是一些没啥用的信息。
<200 OK,{ "parameter" : { "code" : "0000" , "desc" : "成功" , "result" : [ { "m" : [], "n" : [ { "n1" : "123" , "n2" : "456" }, { "n1" : "789" , "n2" : "678" } ] } ] } },{Content-Type=[text/json;charset=UTF-8], Transfer-Encoding=[chunked], Connection=[keep-alive], Date=[Thu, 31 Oct 2024 06:52:39 GMT], X-Kong-Upstream-Latency=[7], X-Kong-Proxy-Latency=[10844], Via=[kong/2.0.1]}>
2、我看到一种说法是:在RestTemplate.post()中如果要使用map,只能使用LinkedMultiValueMap,通过实践发现并不是这样,使用普通map即可。
当然,除了map,还能使用JSONObject等。