Анотации на Spring's RequestBody и ResponseBody

1. Въведение

В този бърз урок ние предоставяме кратък преглед на анотациите Spring @RequestBody и @ResponseBody .

2. @RequestBody

Казано по-просто, по @RequestBody анотацията очертава HttpRequest тялото на прехвърляне или домейн обект, което дава възможност за автоматично deserialization на входящия HttpRequest тялото върху обект Java.

Първо, нека да разгледаме метода на Spring контролер:

@PostMapping("/request") public ResponseEntity postController( @RequestBody LoginForm loginForm) { exampleService.fakeAuthenticate(loginForm); return ResponseEntity.ok(HttpStatus.OK); }

Spring автоматично десериализира JSON в тип Java, ако приемем, че е посочен подходящ.

По подразбиране типът, който анотираме с анотацията @RequestBody, трябва да съответства на JSON, изпратен от нашия клиентски контролер:

public class LoginForm { private String username; private String password; // ... }

Тук обектът, който използваме за представяне на тялото на HttpRequest, се свързва с нашия обект LoginForm .

Нека тестваме това с помощта на CURL:

curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data '{"username": "johnny", "password": "password"}' "//localhost:8080/.../request"

Това е всичко, от което се нуждаем за Spring REST API и Angular клиент, използващ анотацията @ RequestBody .

3. @ResponseBody

В @ResponseBody анотацията казва контролер, че обектът се връща автоматично в поредица JSON и пренесени обратно в HttpResponse обекта.

Да предположим, че имаме персонализиран обект за отговор :

public class ResponseTransfer { private String text; // standard getters/setters }

След това може да се приложи свързаният контролер:

@Controller @RequestMapping("/post") public class ExamplePostController { @Autowired ExampleService exampleService; @PostMapping("/response") @ResponseBody public ResponseTransfer postResponseController( @RequestBody LoginForm loginForm) { return new ResponseTransfer("Thanks For Posting!!!"); } }

В конзолата за програмисти на нашия браузър или с помощта на инструмент като Postman можем да видим следния отговор:

{"text":"Thanks For Posting!!!"}

Не забравяйте, че не е необходимо да анотираме коментираните @ RestController контролери с анотацията @ResponseBody, тъй като Spring го прави по подразбиране.

3.1. Задаване на типа съдържание

Когато използваме анотацията @ResponseBody , все още можем да зададем изрично типа съдържание, който методът ни връща.

За това можем да използваме атрибута за произвеждане на @RequestMapping . Имайте предвид, че анотациите като @PostMapping , @GetMapping и др. Дефинират псевдоними за този параметър.

Нека сега добавим нова крайна точка, която изпраща JSON отговор:

@PostMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseTransfer postResponseJsonContent( @RequestBody LoginForm loginForm) { return new ResponseTransfer("JSON Content!"); }

В примера използвахме константата MediaType.APPLICATION_JSON_VALUE . Като алтернатива можем да използваме application / json директно.

След това нека внедрим нов метод, съотнесен към същия път / съдържание , но вместо това връща XML съдържание:

@PostMapping(value = "/content", produces = MediaType.APPLICATION_XML_VALUE) @ResponseBody public ResponseTransfer postResponseXmlContent( @RequestBody LoginForm loginForm) { return new ResponseTransfer("XML Content!"); }

Сега, в зависимост от стойността на параметър Accept , изпратен в заглавката на заявката, ще получим различни отговори.

Нека да видим това в действие:

curl -i \ -H "Accept: application/json" \ -H "Content-Type:application/json" \ -X POST --data '{"username": "johnny", "password": "password"}' "//localhost:8080/.../content"

Командата CURL връща JSON отговор:

HTTP/1.1 200 Content-Type: application/json Transfer-Encoding: chunked Date: Thu, 20 Feb 2020 19:43:06 GMT {"text":"JSON Content!"}

Сега нека променим параметъра Accept :

curl -i \ -H "Accept: application/xml" \ -H "Content-Type:application/json" \ -X POST --data '{"username": "johnny", "password": "password"}' "//localhost:8080/.../content"

Както се очакваше, този път получаваме XML съдържание:

HTTP/1.1 200 Content-Type: application/xml Transfer-Encoding: chunked Date: Thu, 20 Feb 2020 19:43:19 GMT XML Content!

4. Заключение

Изградихме прост Angular клиент за приложението Spring, който демонстрира как да използваме анотациите @RequestBody и @ResponseBody .

Освен това показахме как да зададем тип съдържание, когато използваме @ResponseBody .

Както винаги, примерни кодове са достъпни в GitHub.