使用resttemplate调用外部put请求,提示‘400 bad request’
问题描述:今天在项目内部调用外部put类型api时出现以下报错:
我请求的api的url地址是参数在中间的这种:/a/b/{参数}/c/{参数2}
分析应该是参数传递的方式不对,导致该错误
解决方案尝试
在网上搜了一些相关问题后,参照网友的解决方案,做了以下尝试
尝试-1:使用exchange方法
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();map.add(category_id,category_value);
MultiValueMap<String, String> map2= new LinkedMultiValueMap<String, String>();
map2.add("id",parent_id);
map2.add("category_id",category_id.split("_")[0]);
try{
//封装RestTemplate到工具类RestTemplateUtils
ResponseEntity responseEntity = RestTemplateUtils.put("https://...../api/v1/nodes/{id}/categories/{category_id}/",headers, map,String.class,map2);
}catch (Exception e){
log.error(e.getMessage());
}
//RestTemplate工具类RestTemplateUtils实现 /**
* PUT请求调用方式
* @param url 请求URL
* @param headers 请求头参数
* @param requestBody 请求参数体
* @param responseType 返回对象类型
* @param uriVariables URL中的变量,与Map中的key对应
* @return ResponseEntity 响应对象封装类
*/
public static <T> ResponseEntity<T> put(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {
HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
return geTemplate().exchange(url, HttpMethod.PUT, requestEntity, responseType, uriVariables);
}
尝试结果:依然报错
尝试-2:使用put方法,修改工具类里的方法为put方法
/*
* PUT请求调用方式
* @param url 请求URL
* @param headers 请求头参数
* @param requestBody 请求参数体
* @param responseType 返回对象类型
* @param uriVariables URL中的变量,与Map中的key对应
* @return ResponseEntity 响应对象封装类
*/
public static <T> ResponseEntity<T> put(String url, HttpHeaders headers, Object requestBody, Class<T> responseType, Map<String, ?> uriVariables) {
HttpEntity<Object> requestEntity = new HttpEntity<Object>(requestBody, headers);
geTemplate().put(url, requestEntity,uriVariables); return null; }
尝试结果:依然失败
尝试-3:在尝试了网上的各种方法都不奏效之后,我用自己修改的下面这种方法,成功解决问题!!!
解决方案:修改url的传参方式
//修改之前:
ResponseEntity<String> responseEntity = RestTemplateUtils.put("https://...../api/v1/nodes/{id}/categories/{category_id}/",headers, map,String.class,map2);
//修改之后:
ResponseEntity<String> responseEntity = RestTemplateUtils.put("https://...../api/v1/nodes/" + parent_id + "/categories/" + category_id.split("_")[0] + "/",headers,map,String.class,map2);
//也就是直接将参数放到url里
尝试结果:请求成功!
以上就是此问题的解决方案,不过程序的问题也因运行环境而异了,希望能给出现同样问题的小伙伴以参考吧!
如果现在没遇到建议收藏一下,以免以后遇到同样的问题找不到解决方法,我是浩说,我们下篇见!