网站首页 > 技术文章 正文
背景:
在使用RestTemplate调用接口是出现了400 Bad Request的异常。
由于接口的参数为json,于是采用了postForEntity进行调用(这样的调用方式在其他的项目调用起来是没有问题的).
调用方式
url: http://xxx.aaa.com?s=/api/fff/dddd
参数格式: json
调用方法: postForEntity(url,json,String.class)
结果:返回400异常
解决
同样的地址、参数、通过postMan访问,能却能够得到正确的响应。一头雾水毫无头绪。理论上不应该有问题的。
后来无意间注意到url中含有s=XXX。尝试url变成httpxxx.aaa.com,把s=XXX用parameter的方式发送过去。返回了302,于是查看服务端日志
无意中发现postMan调用方式会在?s=XXXX前加一个/。
于是把通过restTemplate调用的url改成http://xxx.aaa.com/?s=/api/fff/dddd 重新调用。能够正常响应了。
此时问题搞定了。同时新的问题来了。为什么在其他项目通过少一个/个url能正常访问,而这个项目的不行。
原来在使用SimpleClientHttpRequestFactory配置的RestTemplate,不会对url进行检查。
而是用HttpComponentsClientHttpRequestFactory配置的RestTemplate 会进行rewriteURI