Omgaan met URL-gecodeerde formuliergegevens in Spring REST

REST Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

Voor een eindgebruiker is het indienen van formulieren handig en tot op zekere hoogte gelijk aan het invoeren van gegevens en klikken op een verzendknop. Vanuit technisch oogpunt is er echter een coderingsmechanisme nodig om deze gegevens op betrouwbare wijze van de clientzijde naar de serverzijde te verzenden en te ontvangen voor back-endverwerking.

Voor de reikwijdte van deze tutorial zullen we focus op het maken van een formulier dat de gegevens verzendt als application / x-www-form-urlencoded inhoudstype in een Spring-webapplicatie.

2. Codering van formuliergegevens

De meest gebruikte HTTP-methode voor het indienen van formulieren is POST. Voor idempotente formulierinzendingen kunnen we echter ook de HTTP GET-methode gebruiken. En de manier om de methode te specificeren is via het method attribuut van het formulier.

Voor formulieren die de GET-methode gebruiken, worden de volledige formuliergegevens verzonden als onderdeel van de queryreeks. Maar als we de POST-methode gebruiken, worden de gegevens verzonden als onderdeel van de body van het HTTP-verzoek.

Bovendien kunnen we in het laatste geval ook specificeer de codering van gegevens met de formulieren enctype attribuut, die twee waarden kan aannemen, namelijk application / x-www-form-urlencoded en multipart / form-data.

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

HTML formulieren hebben een standaardwaarde van application / x-www-form-urlencoded voor de enctype attribuut aangezien dit zorgt voor de basisgebruiksgevallen waarin gegevens volledig uit tekst bestaan. Als onze use case echter betrekking heeft op het ondersteunen van bestandsgegevens, moeten we deze overschrijven met een waarde van multipart / form-data.

In wezen verzendt het de formuliergegevens als sleutel-waardeparen, gescheiden door een en-teken (&). Ook worden de respectieve sleutel en waarde gescheiden door het gelijkteken (=). Verder worden alle gereserveerde en niet-alfanumerieke tekens gecodeerd met procentcodering.

3. Formulierverzending in browser

Nu we onze basis hebben behandeld, laten we doorgaan en kijken hoe we dat kunnen omgaan met URL-gecodeerde formuliergegevens voor een eenvoudig gebruik van feedbackverzending in een Spring-webapp.

3.1. Domeinmodel

Voor ons feedbackformulier moeten we de e-mail-ID van de indiener samen met de opmerking vastleggen. Dus laten we onze domeinmodel in een Feedback klasse:

openbare klas Feedback {private String emailId; private String commentaar; }

3.2. Formulier maken

Om een ​​eenvoudige HTML-sjabloon te gebruiken om ons dynamische webformulier te maken, moeten we Thymeleaf in ons project configureren. Hierna zijn we klaar om een GET eindpunt / feedback dat zal dienen terugkoppeling bekijk het formulier:

@GetMapping (path = "/ feedback") public String getFeedbackForm (Modelmodel) {Feedback feedback = nieuwe Feedback (); model.addAttribute ("feedback", feedback); "feedback" teruggeven; }

Merk op dat we terugkoppeling als een modelattribuut om de gebruikersinvoer vast te leggen. Laten we het volgende doen maak hetterugkoppeling weergave in de feedback.html sjabloon:

We hoeven natuurlijk niet expliciet het enctype attribuut, aangezien het de standaardwaarde kiest van application / x-www-form-urlencoded.

3.3. PRG-stroom

Omdat we gebruikersinvoer accepteren via het feedbackformulier van de browser, moeten we implementeer de POST / REDIRECT / GET (PRG) indieningsworkflow om dubbele indieningen te vermijden.

Laten we eerst het POST-eindpunt implementeren / web / feedback dat zal fungeren als de actie-handler voor het feedbackformulier:

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

Vervolgens kunnen we het omleidings-eindpunt implementeren / feedback / succes dat een GET-verzoek dient:

@GetMapping ("/ feedback / success") public ResponseEntity getSuccess () {retourneer nieuwe ResponseEntity ("Bedankt voor het indienen van feedback.", HttpStatus.OK); }

Om de functionaliteit van de workflow voor het indienen van formulieren in een browser te valideren, gaan we naar localhost: 8080 / feedback:

Ten slotte kunnen we ook controleren of formuliergegevens worden verzonden in de URL-gecodeerde vorm:

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

4. Verzoeken buiten de browser

Soms hebben we misschien geen browsergebaseerde HTTP-client. In plaats daarvan kan onze cliënt een hulpprogramma zijn zoals cURL of Postman. In dat geval hebben we het HTML-webformulier niet nodig. In plaats daarvan kunnen we een / feedback eindpunt dat het POST-verzoek dient:

@PostMapping (path = "/ feedback", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) openbare ResponseEntity handleNonBrowserSubmissions (@RequestBody Feedback feedback) genereert uitzondering {// Save feedback data retourneer nieuwe ResponseEntity ("Bedankt voor het indienen van feedback", HttpStatus. ); }

Bij afwezigheid van het HTML-formulier in onze gegevensstroom, hoeven we niet per se het PRG-patroon te implementeren. Echter, we moeten specificeren dat de bron accepteert APPLICATION_FORM_URLENCODED_VALUE mediatype.

Ten slotte kunnen we het testen met een cURL-verzoek:

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

4.1. FormHttpMessageConverter Basics

Een HTTP-verzoek dat verzendt application / x-www-form-urlencoded gegevens moeten dit specificeren in het Inhoudstype koptekst. Intern gebruikt Spring de FormHttpMessageConverter class om deze gegevens te lezen en te binden met de method parameter.

In gevallen waarin onze methodeparameter van het type is MultiValueMap, kunnen we ofwel de @RequestParam of @RequestBody annotatie om het op de juiste manier te binden met de hoofdtekst van het HTTP-verzoek. Dat komt omdat de Servlet-API de queryparameters en formuliergegevens combineert in een enkele map met de naam parameters, en dat omvat automatisch parseren van de hoofdtekst van het verzoek:

@PostMapping (path = "/ feedback", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public ResponseEntity handleNonBrowserSubmissions (@RequestParam MultiValueMap paramMap) genereert Uitzondering {// Save feedback data retourneer nieuwe ResponseEntityStatus ("Bedankt voor het indienen van feedback", ); }

Echter, voor een methodeparameter van het type anders dan MultiValueMap, zoals onze Feedback domeinobject, moeten we alleen de @RequestBody annotatie.

5. Conclusie

In deze zelfstudie hebben we kort geleerd over het coderen van formuliergegevens in webformulieren. We hebben ook onderzocht hoe URL-gecodeerde gegevens voor browser- en niet-browser HTTP-verzoeken kunnen worden verwerkt door een feedbackformulier in een Spring Boot-webapp te implementeren.

Zoals altijd is de volledige broncode voor de tutorial beschikbaar op GitHub.

REST onder

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS