it-swarm.com.ru

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

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

109
Johnny B

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

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

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

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

143
kanu dialani

Я столкнулся с этой проблемой при попытке отладки конечной точки 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.

86
Morgan Kenyon

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

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

13
Raghuram

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

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

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

8
Mike G

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

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

6
skaffman

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

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

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

5
Yakhoob

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

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

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

4
Alex Worden

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

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

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

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

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

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

Для меня произошла ошибка с этой настройкой:

AndroidAnnotationsSpring Android RestTemplate Module и ...

GsonHttpMessageConverter

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

0
Mateusz Jablonski

Зачем работать усерднее, чем нужно? 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);
}
0
eriegz