日常问题随笔 | 21.11.29 : 使用resttemplate调用外部put请求,提示‘400 bad request’

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

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

日常问题随笔 | 21.11.29

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

尝试结果:请求成功!

以上就是此问题的解决方案,不过程序的问题也因运行环境而异了,希望能给出现同样问题的小伙伴以参考吧!

如果现在没遇到建议收藏一下,以免以后遇到同样的问题找不到解决方法,我是浩说,我们下篇见!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值