Verarbeitung von URL-codierten Formulardaten in Spring REST

REST Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Übersicht

Für einen Endbenutzer ist der Prozess der Formularübermittlung bequem und in gewissem Maße gleichbedeutend mit der Eingabe von Daten und dem Klicken auf eine Schaltfläche zum Senden. Aus technischer Sicht ist jedoch ein Codierungsmechanismus erforderlich, um diese Daten für die Back-End-Verarbeitung zuverlässig von der Clientseite zur Serverseite zu senden und zu empfangen.

Im Rahmen dieses Lernprogramms konzentrieren wir uns auf die Erstellung eines Formulars, das seine Daten als Anwendungstyp / x-www-form-urlencodierter Inhaltstyp in einer Spring-Webanwendung sendet .

2. Formulardatencodierung

Die am häufigsten verwendete HTTP-Methode für Formularübermittlungen ist POST. Für idempotente Formularübermittlungen können wir jedoch auch die HTTP-GET-Methode verwenden. Die Methode kann über das Methodenattribut des Formulars angegeben werden.

Bei Formularen, die die GET-Methode verwenden, werden die gesamten Formulardaten als Teil der Abfragezeichenfolge gesendet. Wenn wir jedoch die POST-Methode verwenden, werden ihre Daten als Teil des Hauptteils der HTTP-Anforderung gesendet.

Darüber hinaus können wir im letzteren Fall auch die Codierung von Daten mit dem enctype- Attribut des Formulars angeben , das zwei Werte annehmen kann, nämlich application / x-www-form-urlencoded und multipart / form-data .

2.1. Medientyp application / x-www-form-urlencoded

HTML- Formulare haben den Standardwert application / x-www-form-urlencoded für das Attribut enctype , da dies die grundlegenden Anwendungsfälle berücksichtigt, in denen Daten vollständig aus Text bestehen. Wenn unser Anwendungsfall jedoch die Unterstützung von Dateidaten umfasst, müssen wir diese mit dem Wert multipart / form-data überschreiben .

Im Wesentlichen werden die Formulardaten als Schlüssel-Wert-Paare gesendet, die durch ein kaufmännisches Und (&) getrennt sind. Außerdem werden der jeweilige Schlüssel und Wert durch das Gleichheitszeichen (=) getrennt. Ferner werden alle reservierten und nicht alphanumerischen Zeichen unter Verwendung der Prozentcodierung codiert.

3. Formularübermittlung im Browser

Nachdem wir unsere Grundlagen behandelt haben, wollen wir uns ansehen, wie wir mit URL-codierten Formulardaten umgehen können, um einen einfachen Anwendungsfall für die Übermittlung von Feedback in einer Spring-Web-App zu erhalten.

3.1. Domänenmodell

Für unser Feedback-Formular müssen wir die E-Mail-Kennung des Absenders zusammen mit dem Kommentar erfassen. Erstellen wir also unser Domain-Modell in einer Feedback- Klasse :

public class Feedback { private String emailId; private String comment; }

3.2. Formular erstellen

Um eine einfache HTML-Vorlage zum Erstellen unseres dynamischen Webformulars zu verwenden, müssen wir Thymeleaf in unserem Projekt konfigurieren. Danach können Sie einen GET-Endpunkt / Feedback hinzufügen , der der Feedback- Ansicht für das Formular dient :

@GetMapping(path = "/feedback") public String getFeedbackForm(Model model) { Feedback feedback = new Feedback(); model.addAttribute("feedback", feedback); return "feedback"; }

Beachten Sie, dass wir Feedback als Modellattribut verwenden, um die Benutzereingaben zu erfassen. Als Nächstes erstellen wir die Feedback- Ansicht in der Vorlage feedback.html :

Natürlich müssen wir das enctype- Attribut nicht explizit angeben , da es den Standardwert von application / x-www-form-urlencoded auswählt .

3.3. PRG Flow

Da wir Benutzereingaben über das Browser-Feedback-Formular akzeptieren, müssen wir den Workflow für die Übermittlung von POST / REDIRECT / GET (PRG) implementieren, um doppelte Übermittlungen zu vermeiden .

Implementieren wir zunächst den POST-Endpunkt / das Web / das Feedback , der als Aktionshandler für das Feedback-Formular fungiert:

@PostMapping( path = "/web/feedback", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public String handleBrowserSubmissions(Feedback feedback) throws Exception { // Save feedback data return "redirect:/feedback/success"; }

Als nächstes können wir den Umleitungsendpunkt / das Feedback / den Erfolg implementieren , der eine GET-Anforderung bedient:

@GetMapping("/feedback/success") public ResponseEntity getSuccess() { return new ResponseEntity("Thank you for submitting feedback.", HttpStatus.OK); }

Besuchen Sie localhost: 8080 / feedback : Um die Funktionalität des Formularübermittlungs-Workflows in einem Browser zu überprüfen.

Schließlich können wir auch überprüfen, ob Formulardaten in der URL-codierten Form gesendet werden:

emailId=abc%40example.com&comment=Sample+Feedback

4. Nicht-Browser-Anfragen

Manchmal haben wir möglicherweise keinen browserbasierten HTTP-Client. Stattdessen könnte unser Client ein Dienstprogramm wie cURL oder Postman sein. In einem solchen Fall benötigen wir das HTML-Webformular nicht. Stattdessen können wir einen / feedback- Endpunkt implementieren , der die POST-Anforderung bedient:

@PostMapping( path = "/feedback", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public ResponseEntity handleNonBrowserSubmissions(@RequestBody Feedback feedback) throws Exception { // Save feedback data return new ResponseEntity("Thank you for submitting feedback", HttpStatus.OK); }

Da das HTML-Formular in unserem Datenfluss nicht vorhanden ist, müssen wir das PRG-Muster nicht unbedingt implementieren. Allerdings müssen wir angeben , dass die Ressource akzeptiert APPLICATION_FORM_URLENCODED_VALUE Medientyp .

Schließlich können wir es mit einer cURL-Anfrage testen:

curl -X POST \ //localhost:8080/feedback \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d 'emailId=abc%40example.com&comment=Sample%20Feedback'

4.1. Grundlagen zu FormHttpMessageConverter

Eine HTTP-Anforderung, die anwendungs- / x-www-form-urlencodierte Daten sendet , muss dies im Content-Type- Header angeben . Intern verwendet Spring die FormHttpMessageConverter- Klasse, um diese Daten zu lesen und mit dem Methodenparameter zu binden.

In cases where our method parameter is of a type MultiValueMap, we can use either the @RequestParam or @RequestBody annotation to bind it appropriately with the body of the HTTP request. That's because the Servlet API combines the query parameters and form data into a single map called parameters, and that includes automatic parsing of the request body:

@PostMapping( path = "/feedback", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public ResponseEntity handleNonBrowserSubmissions( @RequestParam MultiValueMap paramMap) throws Exception { // Save feedback data return new ResponseEntity("Thank you for submitting feedback", HttpStatus.OK); }

However, for a method parameter of type other than MultiValueMap, such as our Feedback domain object, we must use only the @RequestBody annotation.

5. Conclusion

In diesem Tutorial haben wir kurz die Codierung von Formulardaten in Webformularen kennengelernt. Wir haben auch untersucht, wie URL-codierte Daten für HTTP-Anforderungen von Browsern und Nicht-Browsern verarbeitet werden, indem ein Feedback-Formular in einer Spring Boot-Webanwendung implementiert wird.

Wie immer ist der vollständige Quellcode für das Tutorial auf GitHub verfügbar.

REST unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs