Anmerkungen zu RequestBody und ResponseBody von Spring

1. Einleitung

In diesem kurzen Tutorial bieten wir einen kurzen Überblick über die Annotationen Spring @RequestBody und @ResponseBody .

2. @RequestBody

Einfach gesagt, die @RequestBody Karten Anmerkung des Httprequest Körper auf eine Übertragung oder Domänenobjekt, automatische Deserialisierung ermöglicht der eingehenden Httprequest Körper auf ein Java - Objekt.

Schauen wir uns zunächst eine Spring-Controller-Methode an:

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

Spring deserialisiert den JSON automatisch in einen Java-Typ, sofern ein geeigneter Typ angegeben ist.

Standardmäßig muss der Typ , den wir mit der Annotation @RequestBody annotieren, dem von unserem clientseitigen Controller gesendeten JSON entsprechen:

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

Hier wird das Objekt, mit dem wir den HttpRequest- Body darstellen, unserem LoginForm- Objekt zugeordnet.

Testen wir dies mit CURL:

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

Dies ist alles, was wir für eine Spring REST-API und einen Angular-Client mit der Annotation @ RequestBody benötigen .

3. @ResponseBody

Die Annotation @ResponseBody teilt einem Controller mit, dass das zurückgegebene Objekt automatisch in JSON serialisiert und an das HttpResponse- Objekt zurückgegeben wird.

Angenommen, wir haben ein benutzerdefiniertes Antwortobjekt :

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

Als nächstes kann der zugehörige Controller implementiert werden:

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

In der Entwicklerkonsole unseres Browsers oder bei Verwendung eines Tools wie Postman wird die folgende Antwort angezeigt:

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

Denken Sie daran, dass wir die mit @ RestController annotierten Controller nicht mit der Annotation @ResponseBody versehen müssen, da Spring dies standardmäßig tut.

3.1. Einstellen des Inhaltstyps

Wenn wir die Annotation @ResponseBody verwenden , können wir den von unserer Methode zurückgegebenen Inhaltstyp weiterhin explizit festlegen.

Dafür können wir die Verwendung @RequestMapping ‚s produziert Attribut. Beachten Sie, dass Anmerkungen wie @PostMapping , @GetMapping usw. Aliase für diesen Parameter definieren.

Fügen wir nun einen neuen Endpunkt hinzu, der eine JSON-Antwort sendet:

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

Im Beispiel haben wir die Konstante MediaType.APPLICATION_JSON_VALUE verwendet . Alternativ können wir application / json direkt verwenden.

Als Nächstes implementieren wir eine neue Methode, die demselben Pfad / content zugeordnet ist , aber stattdessen XML-Inhalt zurückgibt:

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

Nun, je nach dem Wert eines Accept - Parameter in der Anfrage des Header gesendet, werden wir unterschiedliche Antworten erhalten.

Lassen Sie uns dies in Aktion sehen:

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

Der Befehl CURL gibt eine JSON-Antwort zurück:

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

Ändern wir nun den Parameter Accept :

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

Wie erwartet erhalten wir diesmal einen XML-Inhalt:

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

4. Fazit

Wir haben einen einfachen Angular-Client für die Spring-App erstellt, der die Verwendung der Annotationen @RequestBody und @ResponseBody demonstriert .

Darüber hinaus haben wir gezeigt, wie Sie einen Inhaltstyp festlegen, wenn Sie @ResponseBody verwenden .

Wie immer sind Codebeispiele auf GitHub verfügbar.