Это беспокоило в течение нескольких дней уже, казалось бы, очень простой вопрос:GET в RestTemplate в формате JSON
Я сделать простой запрос GET с использованием RestTemplate в application/json
, но я получаю
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
I «Я не уверен, что я пропустил или сделал не так, но тот же конечный пункт отлично работает на Postman, но единственный diff что я добавил заголовок Content-Type в приложении Postman.
Это мой запрос от Почтальон:
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)». https://en.wikipedia.org/wiki/List_of_HTTP_header_fields –