Spring RestTemplate - http GET с телом запроса - программирование
Подтвердить что ты не робот

Spring RestTemplate - http GET с телом запроса

Возможный дубликат:
HTTP GET с телом запроса

Я читал здесь несколько дискуссий, которые не защищают отправку контента через HTTP GET. Существуют ограничения на размер данных, которые могут быть отправлены через клиентов (веб-браузеры). И обработка данных GET также зависит от серверов. Пожалуйста, обратитесь к разделу Ресурсы ниже.

Однако меня попросили проверить возможность отправки контента через HTTP GET с помощью RestTemplate. Я ссылался на несколько дискуссий на форуме spring, но на них не было ответа. (Пожалуйста, обратите внимание на отправку данных через http Post работает отлично). В обсуждении здесь предлагается использовать POST.

dev env - JBoss AS 5.1, spring 3.1.3

Клиент

    @Test
public void testGetWithBody()
{
    // acceptable media type
    List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
    acceptableMediaTypes.add(MediaType.TEXT_PLAIN);

    // header
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(acceptableMediaTypes);

    // body
    String body = "hello world";
    HttpEntity<String> entity = new HttpEntity<String>(body, headers);

    Map<String, Object> uriVariables = new HashMap<String, Object>();
    uriVariables.put("id", "testFile");

    // Send the request as GET
    ResponseEntity<String> result = restTemplate.exchange(
            "http://localhost:8080/WebApp/test/{id}/body",
            HttpMethod.GET, entity, String.class, uriVariables);

    Assert.assertNotNull(result.getBody());
}

Сервер @Controller

    @RequestMapping(value = "/{id}/body", method = RequestMethod.GET)
public @ResponseBody
String testGetWithBody(@PathVariable String id,
        @RequestBody String bodyContent)
{
    return id + bodyContent;
}

Проблема - выполнение этого тестового примера возвращает 500 Internal Server Error. При отладке я обнаружил, что контроллер не попал.

  • Правильно ли понимать, что RestTemplate предоставляет способ отправки данных в качестве тела запроса, но возникает ошибка, потому что сервер не может обрабатывать тело запроса?

  • Если тело запроса, отправленное через HTTP Get, не является обычным, почему RestTemplate предоставляет API-интерфейсы для его отправки? Означает ли это, что существует несколько серверов, способных обрабатывать тело запроса через GET?

Ресурсы - обсуждение отправки тела через HTTP GET с использованием RestTemplate в spring forum

http://forum.springsource.org/showthread.php?129510-Message-body-with-HTTP-GET&highlight=resttemplate+http+get

http://forum.springsource.org/showthread.php?94201-GET-method-on-RestTemplate-exchange-with-a-Body&highlight=resttemplate+http+get

Ресурсы - Общие обсуждения по отправке тела через HTTP GET

get-with-request-body

is-this-statement-correct-http-get-method-always-has-no-message-body

get-or-post-when-reading-request-body

http-uri-get-limit

4b9b3361

Ответ 1

Правильно ли понимать, что RestTemplate предоставляет способ отправки данных в качестве тела запроса, но возникает ошибка, потому что сервер не может обрабатывать тело запроса?

Вы можете сказать, просмотрев сетевой трафик (отправляется запрос с телом запроса и методом GET?) и в журналах сервера (полученный результат 500 должен иметь эффект на стороне сервера, который регистрируется, и если не настройте сервер для этого).

Если тело запроса, отправленное через HTTP Get, не является обычным, почему RestTemplate предоставляет API-интерфейсы для его отправки? Означает ли это, что существует несколько серверов, способных обрабатывать тело запроса через GET?

Поскольку это общий класс, который также позволяет обрабатывать запросы, которые могут содержать тело сообщения.

Как указано в HTTP GET с телом запроса:

Другими словами, любому сообщению HTTP-запроса разрешено содержать тело сообщения, и поэтому [сервер] должен анализировать сообщения с учетом этого. Однако семантика сервера для GET ограничена таким, что тело, если оно есть, не имеет семантического значения для запроса. Требования к разбору отдельно от требований к семантике метода.

Тело в GET не может делать ничего семантически, потому что вы запрашиваете ресурс. Как будто вы говорите серверу: "Дайте мне ресурс X, о, и у вас есть яблоки!". Сервер не заботится о ваших яблоках и с радостью обслуживает ресурс X - или выдаёт ошибку, потому что ему не нравятся предложения в запросе.

Однако меня попросили проверить возможность отправки контента через HTTP GET

Пожалуйста, сообщите тем, кто попросил об этом, это случай, который не должен быть проверен, потому что никакая разумная реализация не поддерживает его.