对于一个看似非常简单的问题,已经困扰了几天了:
我在application/json
中使用restTemplate发出一个简单的get请求,但是
org.springframework.web.client.HttpClientErrorException: 400 Bad Request
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:636)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:592)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:552)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:470)
我做了研究并跟踪了这个tutorial,我也从这个POST request via RestTemplate in JSON中寻找了解决方案。但没人帮我,这是我的密码:
RestTemplate restTemplate = new RestTemplate();
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
restTemplate.exchange(endpoint, HttpMethod.GET, requestEntity, String.class);
endpoint
是http://localhost:8080/api/v1/items?itemIds=" + URLEncoder.encode(itemIds, "UTF-8")
在邮递员中工作正常。itemIds
是一个逗号分隔的列表,如下所示:5400028914,5400029138,5400029138,5400029138,5400029138,5400028401,5400028918,5400028076,5400028726
我还尝试使用如下
getForObject
:String result = restTemplate.getForObject(endpoint, String.class);
这就给了我一个错误:
org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type
我不知道我错过了什么或做错了什么,但同一个端点在postman上工作得很好,但唯一的区别是我在postman应用程序中添加了内容类型头。
这是我邮递员的要求:
GET /api/v1/items?itemIds=abc%2cdef%2cghi HTTP/1.1Host: localhost:8080Connection: keep-alivePostman-Token: 84790e06-86aa-fa8a-1047-238d6c931a68Cache-Control: no-cacheUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36Content-Type: application/jsonAccept: */*Accept-Encoding: gzip, deflate, sdchAccept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
那么,如果上面的代码是错误的,我如何使用restemplate正确地设置内容类型呢?
另一个深层次,我启动了Wireshark来捕获两个http请求,下面是截图:
邮递员的请求:
来自Java代码的请求:
我仍然不明白为什么我的java程序的一个抛出400,而邮递员的一个工作良好。
谢谢。
最佳答案
好吧,最终,我的一个同事帮我弄明白了为什么,信不信由你,这很简单:endpoint
是这样的:"http:localhost:8080/api/v1/items?itemIds=" + URLEncoder.encode(itemIds, "UTF-8");
但是,它应该"http:localhost:8080/api/v1/items?itemIds=" + itemIds;
itemIds
只是一个逗号分隔的列表。
通过“utf-8”模式进行urlencoder编码后,这个逗号分隔的列表将变为itemIds=5400028914%2C5400029138%2C5400029138%2C5400029138%2C5400029138%2C5400028401%2C5400028918%2C5400028076
从itemIds=5400028914,5400029138,5400029138,5400029138,5400029138,5400028401,5400028918,5400028076,5400028726
在使用restTemplate时,我们不需要urlencoder来编码url,有谁可以帮助我加深对这里的理解?
谢谢!