GET вызов с телом запроса - тело запроса не доступно на контроллере - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь выполнить вызов get с телом запроса (JSON), поскольку список параметров запроса превышает ограничение.Я могу отправить запрос через почтальона / бессонницу, и запрос доходит до контроллера без каких-либо ошибок.Но «requstBody» пуст на контроллере.Что мне здесь не хватает?

@GET
@Path("\path")
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public Response getResponse(String requestBody) throws IOException { }

Когда я заменил @GET на @POST, requestBody имеет значение.Для вызова GET нам нужно добавить что-нибудь еще?

Ответы [ 4 ]

0 голосов
/ 03 января 2019

Я пытаюсь выполнить вызов get с телом запроса (JSON), поскольку список параметров запроса превышает ограничение.Я могу отправить запрос через почтальона / бессонницу, и запрос доходит до контроллера без каких-либо ошибок.Но «requstBody» пуст на контроллере.Чего мне здесь не хватает?

Единственное, чего вам не хватает, так это того факта, что семантика тела запроса с GET не очень хорошо определена.

RFC 7231, Section4.3.1 :

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

0 голосов
/ 03 января 2019
@RequestMapping("/path/{requestBody}")
public Response getResponse(@PathVariable String requestBody) throws IOException { }
0 голосов
/ 03 января 2019

Существует два способа отправки параметров в методе Http Get. PathVariable и RequestParam. Таким образом, отправленные параметры видны в URL запроса. например:

www.sampleAddress.com/countries/{parameter1}/get-time?city=someValues

В приведенном выше запросе parameter1 является переменной пути, а parameter2 является параметром запроса. Таким образом, пример действительного URL будет:

www.sampleAddress.com/countries/Germany/get-time?city=berlin

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

@GetMapping(value = "/countries/{parameter1}/get-time", produces = "application/json; charset=utf-8")
public String getTimeOfCities(
    @PathVariable(value = "parameter1") String country,
    @RequestParam(value = "city") String city
){
    return "the method is not implemented yet";
}

Вы можете отправить RequestBody через Get запрос, но это не рекомендуется в соответствии с этой ссылкой.

да, вы можете отправить тело с GET, и нет, это никогда не полезно сделать это.

Эта разработка на сайте asticsearch тоже хороша:

HTTP-библиотеки некоторых языков (особенно JavaScript) не позволяют GET-запросам иметь тело запроса. Фактически, некоторые пользователи удивляются, что GET-запросам всегда разрешено иметь тело.

Правда в том, что RFC 7231 - RFC, который имеет дело с семантикой HTTP и содержимое - не определяет, что должно произойти с запросом GET с тело! В результате некоторые HTTP-серверы позволяют это, а некоторые - особенно кеширующие прокси - не надо.

Если вы хотите использовать метод Post, вы также можете иметь RequestBody. В случае, если вы хотите отправить данные с помощью почтового запроса, соответствующий контроллер будет выглядеть так:

@PostMapping(value = "/countries/{parameter1}/get-time", produces = "application/json; charset=utf-8")
public String getTimeOfCitiesByPost(
        @PathVariable(value = "parameter1") String country,
        @RequestParam(value = "city") String city,
        @RequestBody Object myCustomObject

){
    return "the method is not implemented yet";
}

myCustomObject может иметь любой тип данных, который вы определили в своем коде. Обратите внимание, что таким образом вы должны отправить тело запроса в виде строки Json.

0 голосов
/ 03 января 2019

поставить @RequestBody на String requestBody параметр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...