【发布时间】:2017-06-27 19:44:53
【问题描述】:
一个看似超级简单的问题已经困扰了几天:
我正在使用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") 在 Postman 中可以正常工作。
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 应用程序中添加了 Content-Type 标头。
这是邮递员的请求:
GET /api/v1/items?itemIds=abc%2cdef%2cghi HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Postman-Token: 84790e06-86aa-fa8a-1047-238d6c931a68
Cache-Control: no-cache
User-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.36
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
如果上面的代码有误,我该如何使用 RestTemplate 正确设置内容类型?
又一次深入研究,我已经启动 Wireshark 来捕获两个 HTTP 请求,以下是屏幕截图:
我仍然不明白为什么我的 Java 程序中的那个会抛出 400 而 Postman 中的那个却可以正常工作。
非常感谢。
【问题讨论】:
-
你试过 getForObject() 和 getForEntity() 了吗?在您的情况下,它们可能比 exchange() 更好。
-
转储您通过邮递员发送的请求并在此处发布。
-
但是你为什么要使用内容类型的 GET 请求呢?内容类型是“请求正文的 MIME 类型(用于 POST 和 PUT 请求)。” en.wikipedia.org/wiki/List_of_HTTP_header_fields
-
当然,我尝试了 getForObject(),请参阅我对原始帖子的编辑。我也会尝试 getForEntity 。 @zakariaamine
-
感谢您指出。 @VladBochenin,但在这种情况下,我如何指定它的内容类型?谢谢。
标签: java spring http get resttemplate