Request body spring что это
Аннотации Spring RequestBody и ResponseBody
1. Введение
2. @RequestBody
Проще говоря, @RequestBody аннотации отображает HttpRequest тело к передаче или объекту домена, что позволяет автоматически десериализации въездного HttpRequest тела на объект Java.
Во-первых, давайте посмотрим на метод контроллера Spring:
Spring автоматически десериализует JSON в тип Java, если указан соответствующий тип.
По умолчанию тип, который мы аннотируем аннотацией @RequestBody, должен соответствовать JSON, отправляемому нашим клиентским контроллером:
Давайте проверим это с помощью CURL:
3. @ResponseBody
@ResponseBody аннотация говорит контроллер, возвращаемый объект автоматически сериализуются в JSON и передается обратно в HttpResponse объект.
Предположим, у нас есть собственный объект Response :
Далее может быть реализован связанный контроллер:
В консоли разработчика нашего браузера или с помощью такого инструмента, как Postman, мы можем увидеть следующий ответ:
3.1. Установка типа контента
Давайте теперь добавим новую конечную точку, которая отправляет ответ JSON:
Теперь, в зависимости от значения параметра Accept, отправленного в заголовке запроса, мы получим разные ответы.
Давайте посмотрим на это в действии:
Команда CURL возвращает ответ JSON:
Теперь изменим параметр Accept :
Как и ожидалось, на этот раз мы получим XML-контент:
4. Вывод
Как всегда, образцы кода доступны на GitHub.
Spring’s RequestBody and ResponseBody Annotations
Last modified: November 25, 2021
1. Introduction
In this quick tutorial, we provide a concise overview of the Spring @RequestBody and @ResponseBody annotations.
Further reading:
Guide to Spring Handler Mappings
Quick Guide to Spring Controllers
The Spring @Controller and @RestController Annotations
2. @RequestBody
Simply put, the @RequestBody annotation maps the HttpRequest body to a transfer or domain object, enabling automatic deserialization of the inbound HttpRequest body onto a Java object.
First, let’s have a look at a Spring controller method:
Spring automatically deserializes the JSON into a Java type, assuming an appropriate one is specified.
By default, the type we annotate with the @RequestBody annotation must correspond to the JSON sent from our client-side controller:
Here, the object we use to represent the HttpRequest body maps to our LoginForm object.
Let’s test this using CURL:
This is all we need for a Spring REST API and an Angular client using the @RequestBody annotation.
3. @ResponseBody
The @ResponseBody annotation tells a controller that the object returned is automatically serialized into JSON and passed back into the HttpResponse object.
Suppose we have a custom Response object:
Next, the associated controller can be implemented:
In the developer console of our browser or using a tool like Postman, we can see the following response:
Remember, we don’t need to annotate the @RestController-annotated controllers with the @ResponseBody annotation since Spring does it by default.
3.1. Setting the Content Type
When we use the @ResponseBody annotation, we’re still able to explicitly set the content type that our method returns.
For that, we can use the @RequestMapping‘s produces attribute. Note that annotations like @PostMapping, @GetMapping, etc. define aliases for that parameter.
Let’s now add a new endpoint that sends a JSON response:
In the example, we used the MediaType.APPLICATION_JSON_VALUE constant. Alternatively, we can use application/json directly.
Next, let’s implement a new method, mapped to the same /content path, but returning XML content instead:
Now, depending on the value of an Accept parameter sent in the request’s header, we’ll get different responses.
Let’s see this in action:
The CURL command returns a JSON response:
Now, let’s change the Accept parameter:
As anticipated, we get an XML content this time:
4. Conclusion
We’ve built a simple Angular client for the Spring app that demonstrates how to use the @RequestBody and @ResponseBody annotations.
Additionally, we showed how to set a content type when using @ResponseBody.
As always, code samples are available over on GitHub.
Аннотации @RequestBody и @ResponseBody в Spring
Может ли кто-нибудь объяснить аннотации @RequestBody и @ResponseBody в Spring 3? Для чего они? Любые примеры были бы замечательными.
4 ответа
В документации есть целый раздел под названием 16.3.3.4 Сопоставление тела запроса с аннотацией @RequestBody. И один называется 16.3. 3.5 Сопоставление тела ответа с аннотацией @ResponseBody. Предлагаю вам ознакомиться с этими разделами. Также актуально: @RequestBody javadocs, @ResponseBody javadocs
Примеры использования будут примерно такими:
Используя JavaScript-библиотеку, такую как JQuery, вы разместите JSON-объект следующим образом:
Ваш метод контроллера будет выглядеть так:
Теперь, если у вас есть Jackson в пути к классам (и у вас есть setup), Spring преобразует входящие JSON в объект UserStats из тела сообщения (потому что вы добавили аннотацию @RequestBody ), и он сериализует возвращенный объект в JSON (потому что вы добавили аннотацию @ResponseBody ). Таким образом, браузер / клиент увидит этот результат JSON:
Полный рабочий пример см. В моем предыдущем ответе: https://stackoverflow.com/a/5908632/342852
Примечание. RequestBody / ResponseBody, конечно, не ограничивается JSON, оба могут обрабатывать несколько форматов, включая простой текст и XML, но JSON, вероятно, является наиболее часто используемым форматом.
Обновить
Начиная с Spring 4.x, вы обычно не будете использовать @ResponseBody на уровне метода, а скорее будете использовать @RestController на уровне класса с тем же эффектом.
Вот цитата из официального Документация Spring MVC:
В приведенном выше примере они будут отображать все данные о пользователях и конкретных идентификаторах, теперь я хочу использовать как идентификатор, так и имя,
1) localhost: 8093 / plejson / shop / user 0
Ниже приведен пример метода в контроллере Java.
Используя аннотацию @RequestBody, вы получите свои значения, сопоставленные с моделью, которую вы создали в своей системе для обработки любого конкретного вызова. Используя @ResponseBody, вы можете отправить что угодно обратно в то место, откуда был сгенерирован запрос. Обе вещи будут легко сопоставлены без написания специального парсера и т. Д.
@RequestBody : аннотация, указывающая, что параметр метода должен быть привязан к телу HTTP-запроса.
@ResponseBody может быть помещена в метод и указывает, что тип возвращаемого значения должен быть записан прямо в тело ответа HTTP (а не помещен в модель или интерпретирован как имя представления).
Весенний запросБоди и Аннотации в ответ
Узнайте о весеннем @RequestBody и @ResponseBody аннотациях.
Весенний запросБоди и Аннотации в ответ
1. Введение
В этом кратком учебнике мы предоставляем краткий обзор весеннего @RequestBody и @ResponseBody Аннотации.
Дальнейшее чтение:
Руководство по картированию весенних обработчиков
Краткое руководство по весенним контроллерам
Аннотации @Controller и @RestController весны
2. @RequestBody
Проще говоря, @RequestBody аннотация карты HttpRequest тела к объекту передачи или домена, что позволяет автоматически дезириализация входящих HttpRequest тело на объект Java.
Во-первых, давайте посмотрим на метод контроллера Spring:
Весна автоматически дезирует JSON в java-тип, предполагая, что указан соответствующий тип.
По умолчанию тип, который мы аннотировать с @RequestBody аннотация должна соответствовать JSON, отправленной от нашего контроллера на стороне клиента:
Здесь объект, который мы используем для представления HttpRequest карты тела к нашему ЛогинФорм объект.
Давайте проверить это с помощью CURL:
Это все, что нам нужно для API Spring REST и углового клиента, используя ЗапросБоди аннотация.
3. @ResponseBody
@ResponseBody аннотация сообщает контроллеру, что возвращенный объект автоматически сериализируется в JSON и передается обратно в HttpРеспонс объект.
Предположим, у нас есть пользовательский Ответные объект:
Далее, связанный контроллер может быть реализован:
В консоли разработчика нашего браузера или с помощью инструмента, как Почтальон, мы можем увидеть следующий ответ:
Помните, что нам не нужно аннотировать @RestController- аннотированные контроллеры с @ResponseBody аннотация с весны делает это по умолчанию.
3.1. Установка типа содержимого
Когда мы используем @ResponseBody аннотация, мы все еще можем явно установить тип содержимого, что наш метод возвращается.
Теперь добавим новую конечную точку, которая отправляет ответ JSON:
В примере мы использовали MediaType.APPLICATION_JSON_VALUE постоянный. Кроме того, мы можем использовать приложение/json прямо.
Далее давайте реализуем новый метод, отображенный на ту же /содержание путь, но вместо этого возвращающ содержимое XML:
Теперь, в зависимости от стоимости Примите параметр, отправленный в заголовке запроса, мы получим различные ответы.
Давайте посмотрим на это в действии:
Команда CURL возвращает ответ JSON:
Теперь давайте изменим Примите параметр:
Как и ожидалось, на этот раз мы получаем XML-контент:
4. Заключение
Мы создали простого Angular клиента для приложения Spring, который демонстрирует, как использовать @RequestBody и @ResponseBody Аннотации.
Русские Блоги
Параметры http-запроса (формат application / json):
Его можно проанализировать как объект ProductSyncNegativeDto с помощью @RequestBody (как показано в следующем коде)
Так как же аннотация @RequestBody реализует объект передачи сообщения HTTP-запроса?
Мы можем обнаружить, что результатом является строка json, как аннотация @ResponseBody преобразует объект в строку json и возвращает ее?
Затем учитель принесет детскую обувь, чтобы раскрыть основные принципы реализации @RequestBody и @ResponseBody.
I. Обзор
Прежде чем мы начнем, давайте сначала представим @Controller.Учащиеся, которые работали с проектами ssm / ssh, должны были иметь доступ к springMVC, поэтому аннотация @Controller неизбежно будет использоваться. Метод Controller инкапсулируется в класс ServletInvocableHandlerMethod, а обработка запроса завершается методом invokeAndHandle.
Когда SpringMVC обрабатывает запросы и ответы, он поддерживает несколько типов параметров запроса и возвращаемых типов.Реализация этой функции требует преобразования тел HTTP-сообщений, параметров и возвращаемых значений. По этой причине SpringMVC предоставляет большое количество классов преобразования, все преобразования Все классы реализуют интерфейс HttpMessageConverter.
Интерфейс HttpMessageConverter определяет 5 методов преобразования сообщений HTTP-запроса в объекты Java и преобразования объектов Java в сообщения ответа HTTP.
HandlerMethodArgumentResolver и HandlerMethodReturnValueHandler
В соответствии с методом контроллера SpringMVC метод чтения предназначен для чтения HTTP-запроса и преобразования его в объект параметра, а метод записи заключается в преобразовании объекта возвращаемого значения в сообщение HTTP-ответа. SpringMVC определяет два интерфейса для управления этими двумя процессами: обработчик параметров HandlerMethodArgumentResolver и обработчик возвращаемых значений HandlerMethodReturnValueHandler.
Когда синтаксический анализатор параметров и обработчик возвращаемого значения обрабатываются на нижнем уровне, все они преобразуются с помощью HttpMessageConverter. Процесс выглядит следующим образом:
Во-вторых, процесс синтаксического анализа @RequestBody
Все HTTP-запросы будут входить в метод invokeAndHandle класса ServletInvocableHandlerMethod (унаследованный InvocableHandlerMethod, в нем будут инициализированы все парсеры параметров), давайте посмотрим, что делает метод invokeAndHandle.
Мы видим, что весь метод invokeAndHandle будет входить в метод invokeForRequest. Метод invokeForRequest должен реализовать функцию аннотации @RequestBody и проанализировать сообщение HTTP-запроса в установленный нами объект. Давайте рассмотрим этот метод, чтобы увидеть, что именно происходит внутри.
Затем мы вводим метод getMethodArgumentValues, чтобы ближе познакомиться с конкретным процессом анализа @RequestBody.
Среди них this.resolvers.supportsParameter (параметр) используется для определения, является ли параметр запроса допустимым, а метод this.resolvers.resolveArgument (параметр, mavContainer, request, this.dataBinderFactory), наконец, реализует операцию синтаксического анализа @RequestBody. Давайте посмотрим, что делается в this.resolvers.resolveArgument (параметр, mavContainer, запрос, this.dataBinderFactory).
Метод getArgumentResolver получает соответствующий синтаксический анализатор параметра HandlerMethodArgumentResolver. Анализатор параметров, наконец, выполняет процесс синтаксического анализа через класс RequestResponseBodyMethodProcessor. Давайте посмотрим на процесс метода resolveArgument в RequestResponseBodyMethodProcessor.
Разные преобразователи (интерфейс HandlerMethodArgumentResolver) будут соответствовать различным преобразователям параметров, таким как public String testDemo (String name), преобразователь станет ServletRequestMethodArgumentResolver, если это @RequestBody, преобразователем параметров будет RequestResponseBodyMethodProcessor
В методе readWithMessageConverters метод чтения HttpMessageConverter (интерфейс, соответствующий классу реализации) реализует парсинг HTTP-сообщения. Давайте посмотрим на код финальной части парсинга HTTP-параметра.
Часть кода опущена. Ключевой частью является прохождение всех HttpMessageConverter, а затем определение того, поддерживает ли анализатор с помощью метода canRead, и, наконец, выполнение метода чтения объекта AbstractJackson2HttpMessageConverter (класс реализации HttpMessageConverter) для завершения окончательного анализа параметров.
Метод чтения объекта AbstractJackson2HttpMessageConverter использует инструмент Джексона для преобразования строки json сообщения http в объект объекта и его возврата.
В-третьих, процесс сериализации возвращаемого значения @ResponseBody
После выполнения логического кода doInvoke используйте процессор возвращаемого значения для сериализации и вывода возвращаемого значения с помощью метода invokeAndHandle объекта ServletInvocableHandlerMethod.
Метод selectHandler предоставит подходящий HandlerMethodReturnValueHandler для обработки возвращаемого значения.
загрузка… повторно загрузитьОтмена
Мы увидели, что обработчик HandlerMethodReturnValueHandler наконец-то реализован с помощью RequestResponseBodyMethodProcessor. Давайте специально рассмотрим метод handleReturnValue.
Мы видим, что метод записи HttpMessageConverter (класс реализации AbstractGenericHttpMessageConverter) в конечном итоге используется для сериализации вывода объекта.
Всем известно, что @ResponseBody необходимо прочитать через поток io, то есть последняя запись HttpMessageConverter будет записана в выходной поток io. Вышеупомянутый метод createOutputMessage (webRequest) предназначен для создания потока вывода. Давайте посмотрим на его реализацию.
В методе objectWriter.writeValue (generator, value) объект значения сериализуется с помощью метода сериализации, объект преобразуется в строку json, а затем устанавливается в поток io. Давайте, наконец, посмотрим на окончательную сериализацию Джексона?
В методе сериализации используйте JsonGenerator для преобразования возвращаемого объекта в строку в формате json.
Четыре, инициализация springMVC
Пока что мы в основном прошли процесс HTTP-запроса и ответа. Теперь у вас могут возникнуть сомнения. Мы все используем SpringMVC из коробки. Где определены эти парсеры параметров и обработчики возвращаемых значений? Определяется в методе инициализации основного класса реализации HandlerAdapter RequestMappingHandlerAdapter.
Когда создается RequestMappingHandlerAdapter, многие HttpMessageConverters также инициализируются для поддержки различных требований к преобразованию.
Пять связанных зависимостей
Вы можете обнаружить, что у проекта springboot нет зависимостей, связанных с Джексоном, так почему же Джексон может сериализоваться? Это потому, что зависимости spring-boot-starter-web фактически включают зависимости, связанные с Джексоном.
Шесть, резюме
На первый взгляд простые аннотации @RequestBody и @ResponseBody на самом деле проделали большую внутреннюю подготовку. Теперь детская обувь понимает принцип реализации всего этого процесса.
Для детей, которые хотят больше галантерейных товаров и технических навыков, поторопитесь, возьмите свой мобильный телефон и отсканируйте код, чтобы следовать за мной, я жду вас здесь