Обработка на данни с кодирани URL адреси през пролетта REST

ПОЧИВКА Най-горе

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

1. Общ преглед

За крайния потребител процесът на подаване на формуляра е удобен и до известна степен еквивалентен на просто въвеждане на данни и щракване върху бутона за изпращане. От инженерна гледна точка обаче е необходим механизъм за кодиране, за да се изпращат и получават надеждно тези данни от страна на клиента към страната на сървъра за обратна обработка.

За обхвата на този урок ще се съсредоточим върху създаването на формуляр, който изпраща данните си като тип съдържание / x-www-form-urlencoded съдържание в уеб приложение Spring.

2. Формиране на кодиране на данни

Най-често използваният HTTP метод за изпращане на формуляри е POST. За изпращане на идемпотентни формуляри обаче можем да използваме и метода HTTP GET. И начинът за определяне на метода е чрез атрибута на метода на формуляра.

За формуляри, които използват метода GET, всички данни за формуляри се изпращат като част от низа на заявката. Но ако използваме метода POST, неговите данни се изпращат като част от тялото на HTTP заявката.

Освен това, в последния случай, ние също можем да посочим кодирането на данни с атрибута enctype на формуляра , който може да приеме две стойности, а именно application / x-www-form-urlencoded и multipart / form-data .

2.1. Media type application / x-www-form-urlencoded

HTML формулярите имат стойност по подразбиране application / x-www-form-urlencoded за атрибута enctype , тъй като това се грижи за основните случаи на използване, когато данните са изцяло текст. Независимо от това, ако случаят ни на използване включва поддържащи файлови данни, тогава ще трябва да го заменим със стойност multipart / form-data .

По същество той изпраща данните на формуляра като двойки ключ-стойност, разделени с знак амперсанд (&). Също така съответният ключ и стойност се разделят със знака за равенство (=). Освен това всички запазени и небуквено-цифрови знаци се кодират с помощта на процентно кодиране.

3. Подаване на формуляр в браузъра

След като обхванахме нашите основи, нека да продължим и да видим как можем да се справим с данните от формуляри, кодирани в URL, за прост случай на използване на изпращане на обратна връзка в уеб приложение Spring.

3.1. Модел на домейн

За нашия формуляр за обратна връзка трябва да вземем имейл идентификатора на подателя заедно с коментара. И така, нека създадем нашия домейн модел в клас Feedback :

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

3.2. Създайте формуляр

За да използваме прост HTML шаблон за създаване на нашата динамична уеб форма, ще трябва да конфигурираме Thymeleaf в нашия проект. След това сме готови да добавим GET крайна точка / обратна връзка, която ще обслужва изгледа за обратна връзка за формуляра :

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

Имайте предвид, че използваме обратна връзка като атрибут на модел, за да уловим потребителския вход. На следващо място, нека да създаде обратна връзка гледката в feedback.html шаблон :

Разбира се, не е нужно да посочваме изрично атрибута enctype , тъй като той ще избере стойността по подразбиране на application / x-www-form-urlencoded .

3.3. PRG поток

Тъй като приемаме потребителското въвеждане чрез формуляра за обратна връзка в браузъра, трябва да внедрим работния процес на подаване POST / REDIRECT / GET (PRG), за да избегнем дублиращи се изпращания .

Първо, нека внедрим крайната точка на POST / уеб / обратна връзка, която ще действа като манипулатор на действието за формуляра за обратна връзка:

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

След това можем да приложим пренасочваща крайна точка / обратна връзка / успех, която обслужва GET заявка:

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

За да проверим функционалността на работния процес за подаване на формуляри в браузър, нека посетим localhost: 8080 / feedback :

И накрая, можем също така да проверим дали данните от формуляра се изпращат в URL кодирана форма:

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

4. Заявки без браузър

Понякога може да нямаме HTTP клиент, базиран на браузър. Вместо това нашият клиент може да бъде помощна програма като cURL или Postman. В такъв случай нямаме нужда от HTML уеб формуляра. Вместо това можем да приложим крайна точка / обратна връзка, която обслужва заявката POST:

@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); }

При липса на HTML форма в нашия поток от данни, не е задължително да прилагаме модела PRG. Трябва обаче да уточним, че ресурсът приема APPLICATION_FORM_URLENCODED_VALUE тип носител .

И накрая, можем да го тестваме с заявка за cURL:

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

HTTP заявка, която изпраща data / x-www-form-urlencoded данни, трябва да посочи това в заглавката Content-Type . Вътрешно Spring използва класа FormHttpMessageConverter, за да прочете тези данни и да ги обвърже с параметъра на метода.

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

В този урок научихме накратко за кодирането на данни от формуляри в уеб формуляри. Също така проучихме как да обработваме URL кодирани данни за HTTP заявки на браузър и не-браузър чрез внедряване на формуляр за обратна връзка в уеб приложение Spring Boot.

Както винаги, пълният изходен код за урока е достъпен в GitHub.

ПОЧИВКА отдолу

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА