POST-запрос через RestTemplate в JSON - PullRequest
111 голосов
/ 02 ноября 2010

Я не нашел ни одного примера, как решить мою проблему, поэтому я хочу попросить вас о помощи. Я не могу просто отправить запрос POST, используя объект RestTemplate в JSON

Каждый раз, когда я получаю:

org.springframework.web.client.HttpClientErrorException: 415 неподдерживаемый тип носителя

Я использую RestTemplate таким образом:

...
restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> list = new ArrayList<HttpMessageConverter<?>>();
list.add(new MappingJacksonHttpMessageConverter());
restTemplate.setMessageConverters(list);
...
Payment payment= new Payment("Aa4bhs");
Payment res = restTemplate.postForObject("http://localhost:8080/aurest/rest/payment", payment, Payment.class);

В чем моя вина?

Ответы [ 12 ]

146 голосов
/ 25 мая 2011

Этот метод работал для меня:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.put(url, entity);

Надеюсь, это поможет

87 голосов
/ 03 июня 2015

Я столкнулся с этой проблемой при попытке отладки конечной точки REST. Вот базовый пример использования класса RestTemplate Spring для выполнения запроса POST, который я использовал. Мне потребовалось довольно много времени, чтобы собрать воедино код из разных мест, чтобы получить рабочую версию.

RestTemplate restTemplate = new RestTemplate();

String url = "endpoint url";
String requestJson = "{\"queriedQuestion\":\"Is there pain in your hand?\"}";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<String> entity = new HttpEntity<String>(requestJson,headers);
String answer = restTemplate.postForObject(url, entity, String.class);
System.out.println(answer);

Конкретный синтаксический анализатор JSON, используемый моей конечной точкой отдыха, использовал необходимые двойные кавычки вокруг имен полей, поэтому я избежал двойных кавычек в моей строке requestJson.

68 голосов
/ 24 ноября 2014

Я использовал шаблон отдыха с JSONObjects следующим образом:

// create request body
JSONObject request = new JSONObject();
request.put("username", name);
request.put("password", password);

// set headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<String>(request.toString(), headers);

// send request and parse result
ResponseEntity<String> loginResponse = restTemplate
  .exchange(urlString, HttpMethod.POST, entity, String.class);
if (loginResponse.getStatusCode() == HttpStatus.OK) {
  JSONObject userJson = new JSONObject(loginResponse.getBody());
} else if (loginResponse.getStatusCode() == HttpStatus.UNAUTHORIZED) {
  // nono... bad credentials
}
13 голосов
/ 02 ноября 2010

Как указано здесь Я думаю, вам нужно добавить messageConverter для MappingJacksonHttpMessageConverter

8 голосов
/ 19 мая 2011

Если вы используете Spring 3.0, простой способ избежать исключения org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type состоит в том, чтобы включить файлы jar Джексона в путь к классам, и используйте mvc:annotation-driven элемент конфигурации. Как указано здесь .

Я дергал себя за волосы, пытаясь понять, почему приложение mvc-ajax работает без какой-либо специальной конфигурации для MappingJacksonHttpMessageConverter. Если вы читаете статью, которую я тесно связал выше:

Под чехлами Spring MVC делегирует HttpMessageConverter для выполнить сериализацию. В этом случай, Spring MVC вызывает MappingJacksonHttpMessageConverter построен на процессоре JSON JSON. Эта реализация включена автоматически при использовании mvc: конфигурация на основе аннотаций элемент с Джексоном присутствует в вашем * 1015 путь к классу *.

6 голосов
/ 02 ноября 2010

Ошибка «415 Unsupported Media Type» говорит вам, что сервер не примет ваш запрос POST.Ваш запрос абсолютно правильный, неправильно настроен сервер.

MappingJacksonHttpMessageConverter автоматически установит заголовок типа содержимого запроса на application/json, и я предполагаю, что ваш сервер отклоняет это.Вы ничего не рассказали нам о настройке вашего сервера, поэтому я не могу дать вам совет по этому поводу.

5 голосов
/ 21 ноября 2017

Я делаю таким образом, и это работает.

HttpHeaders headers = createHttpHeaders(map);
public HttpHeaders createHttpHeaders(Map<String, String> map)
{   
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    for (Entry<String, String> entry : map.entrySet()) {
        headers.add(entry.getKey(),entry.getValue());
    }
    return headers;
}

// Передаем заголовки сюда

 String requestJson = "{ // Construct your JSON here }";
logger.info("Request JSON ="+requestJson);
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
logger.info("Result - status ("+ response.getStatusCode() + ") has body: " + response.hasBody());
logger.info("Response ="+response.getBody());

Надеюсь, это поможет

4 голосов
/ 06 октября 2015

У меня возникла эта проблема, и я использую RestTemplate Spring на клиенте и Spring Web на сервере.Оба API имеют очень плохие сообщения об ошибках, что делает их чрезвычайно сложными для разработки.

После многих часов попыток всевозможных экспериментов я выяснил, что проблема была вызвана передачей пустой ссылки на тело POST вместо ожидаемого списка.Я предполагаю, что RestTemplate не может определить тип содержимого из нулевого объекта, но не жалуется на это.После добавления правильных заголовков я начал получать другое исключение на стороне сервера в Spring перед вводом моего метода обслуживания.

Исправление состояло в том, чтобы передать пустой список от клиента вместо нуля.Заголовки не требуются, так как тип содержимого по умолчанию используется для ненулевых объектов.

3 голосов
/ 20 октября 2016

Этот код работает для меня;

RestTemplate restTemplate = new RestTemplate();
Payment payment = new Payment("Aa4bhs");
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
map.add("payment", payment);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(map, headerObject);

Payment res = restTemplate.postForObject(url, httpEntity, Payment.class);
2 голосов
/ 12 декабря 2018

Если вы не хотите обрабатывать ответ

private RestTemplate restTemplate = new RestTemplate();
restTemplate.postForObject(serviceURL, request, Void.class);

Если вам нужен ответ на процесс

String result = restTemplate.postForObject(url, entity, String.class);
...