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.