GET request in RestTemplate in JSON
一个似乎超级简单的问题已经困扰了几天:
我正在使用
1 2 3 4 5 6 | 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) |
我进行了研究并遵循了本教程,并且通过JSON中的RestTemplate通过此POST请求查看了解决方案。但是他们都没有帮助,这是我的代码:
1 2 3 4 5 | 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); |
我还尝试使用
这给了我这个错误:
1 | 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代码中的请求:
我仍然不明白为什么我的Java程序中的那个抛出400,而Postman中的那个却正常工作。
非常感谢。
好吧,最终,我的一位同事帮助我弄清楚了为什么,不管你信不信,这很简单:
但是,它应该是
通过" UTF-8"模式对URLEncoder进行编码后,此逗号分隔的列表变为
从
使用RestTemplate时,不需要URLEncoder对URL进行编码,有人可以在这里加深我的理解吗?
谢谢!
您不需要为GET方法设置" requestEntity",请尝试如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public ItemInfo getItemInfo() throws Exception { String url = "http://localhost:8080/api/v1/items?itemIds=abc"; ObjectMapper objectMapper = new ObjectMapper(); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, null, String.class); String responseBody = response.getBody(); handlerError(response, url); try { return objectMapper.readValue(responseBody, ItemInfo.class); } catch (IOException exception) { LOGGER.error("failed to send REST request", exception); throw new Exception(ErrorCode.NOT_AVAILABLE, url); } } private void handlerError(final ResponseEntity<String> response, final String url) throws Exception { String responseBody = response.getBody(); try { if (RestUtil.isError(response.getStatusCode())) { ObjectMapper objectMapper = new ObjectMapper(); MyInfoError myInfoError = objectMapper.readValue(responseBody, MyInfoError.class); throw new Exception(infoErreur, ErrorCode.UNKNOWN_CODE_ERROR); } else if (RestUtil.isNotFound(response.getStatusCode())) { throw new Exception(ErrorCode.NOT_AVAILABLE,"MyService"); } } catch (IOException exception) { LOGGER.error("failed to send REST request", exception); throw new Exception(ErrorCode.NOT_AVAILABLE, url); } } |
我将其设为NULL,因为GET方法不会发送任何JSON请求正文/标头:
1 |
或者:将标头放在GET方法中,如下所示:
1 2 3 4 5 | RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); HttpEntity< ? > requestEntity = new HttpEntity<>(headers); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class); |
对于POST的示例,您需要如下设置requestEntity:
1 2 3 4 5 |
希望这个帮助:)