Запрос POST через RestTemplate в JSON

Я не нашел ни одного примера, как решить мою проблему, поэтому я хочу попросить вас о помощи. Я не могу просто отправить запрос 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);

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

Ответ 1

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

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

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

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

Ответ 2

Я столкнулся с этой проблемой при попытке отладки конечной точки REST. Вот базовый пример с использованием класса Spring RestTemplate, чтобы сделать запрос 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 моя конечная точка останова использовала необходимые двойные кавычки вокруг имен полей, поэтому почему я избежал двойных кавычек в моей строке запроса Json.

Ответ 3

Я использовал шаблон отдыха с 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
}

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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());

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

Ответ 8

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

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

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

Ответ 9

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

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);

Ответ 10

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

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

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

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

Ответ 11

Для меня возникла ошибка:

AndroidAnnotations Spring Android RestTemplate Module и...

GsonHttpMessageConverter

Аннотации Android имеют некоторые проблемы с этим преобразованным для генерации запроса POST без параметра. Просто параметр new Object() решил это для меня.

Ответ 12

Зачем работать усерднее, чем нужно? postForEntity принимает простой объект Map качестве входных данных. Следующее прекрасно работает для меня при написании тестов для данной конечной точки REST в Spring. Я считаю, что это самый простой способ сделать запрос JSON POST в Spring:

@Test
public void shouldLoginSuccessfully() {
  // 'restTemplate' below has been @Autowired prior to this
  Map map = new HashMap<String, String>();
  map.put("username", "bob123");
  map.put("password", "[email protected]");
  ResponseEntity<Void> resp = restTemplate.postForEntity(
      "http://localhost:8000/login",
      map,
      Void.class);
  assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
}