很久没用restTemplate发送http请求了,今天写代码需要就又复习了一遍
JSONObject j = restTemplate.postForEntity(url,param,JSONObject.class);
参数1:请求的地址
参数2:请求体
参数3:请求响应类型
public class Test{
@Autowired
// 注意springboot没有自动注入该类需要自行注入
private RestTemplate restTemplate;
public void show(){
HttpHeaders httpHeaders = new HttpHeaders();
// 这是设置请求头的类型
httpHeaders.add("accept",MediaType.APPLICATION_JSON_UTF8)
// 这里setContentType是设置请求体的类型
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
// 创建请求体载体
MultiValueMap<String,Object> multiValueMap2 =
new LinkedMultiValueMap<>();
multiValueMap2.add("key",value);
// 使用httpEntity装载请求头和请求体
HttpEntity httpEntity =
new HttpEntity<>(multiValueMap2,httpHeaders);
restTemplate.postForEntity(url,httpEntity,JSONObject.class);
}
}
注意:请求体类型设置是根据请求接口的consumer类型决定如:
@PostMapping(value = "/createItem",
// 当前接口可以接受的请求体类型
consumes = MediaType.APPLICATION_JSON_VALUE,
// 当前接口返回的类型
produces = MediaType.APPLICATION_JSON_VALUE)
一般415报错都是请求的接口不支持本次请求体类型导致
注意:MulitValueMap<String,Object>这里的泛型很讲究!
// 如果泛型是MulitValueMap<String,Object>那么设置参数
mulit.add("item","123");
mulit.add("item2",new String[]{"123","234"});
// 通过日志可以发现传递的请求体是这样的,会转成数组接收方很大可能会报错400
{"item":["123"],"item2":["["123","234"]"]}
// 具体的原因可以看下他的继承关系就明白了,继承了Map<String,List<V>>
public interface MultiValueMap<K, V> extends Map<K, List<V>> {...}
// 解决办法
Map<String,Object> map = new HashMap<>();
map.put("item","213");
map.put("item2",new String[]{"123","234"});
HttpHeaders head = new Header();
// 相关头信息的插入
head.put........
HttpEntity httpEntity =
new HttpEntity<>(JSONObject.toJSONString(map),header);
// 这样传参就没问题了