日常琐事随笔 (日常问题短文)

使用resttemplate调用外部put请求,提示‘400 bad request’

问题描述:今天在项目内部调用外部put类型api时出现以下报错:

日常小事随笔100字,日常琐事随笔初中

我请求的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里

尝试结果:请求成功!