טיפול בנתוני טופס מקודדים בכתובת אתר ב- REST באביב
רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:
>> בדוק את הקורס1. סקירה כללית
עבור משתמש קצה תהליך הגשת הטופס נוח, ובמידה מסוימת, שווה ערך להזנת נתונים ולחיצה על כפתור הגשה. עם זאת, מנקודת מבט הנדסית, נדרש מנגנון קידוד כדי לשלוח ולקבל את הנתונים בצורה מהימנה מצד הלקוח לצד השרת לצורך עיבוד עורפי.
להיקף של מדריך זה, אנו להתמקד ביצירת טופס ששולח את הנתונים שלו כ- יישום / x-www-form-urlencoded סוג תוכן ביישום אינטרנט באביב.
2. קידוד נתוני טופס
שיטת ה- HTTP הנפוצה ביותר להגשת טפסים היא POST. עם זאת, עבור הגשות טופס חסרות יכולות, אנו יכולים גם להשתמש בשיטת HTTP GET. והדרך לציין את השיטה היא באמצעות תכונת השיטה של הטופס.
עבור טפסים המשתמשים בשיטת GET, כל נתוני הטופס נשלחים כחלק ממחרוזת השאילתה. אבל אם אנו משתמשים בשיטת POST, הנתונים שלה נשלחים כחלק מגוף בקשת ה- HTTP.
יתר על כן, במקרה האחרון, אנו יכולים גם ציין את קידוד הנתונים עם הטפסים להקליד תְכוּנָה, שיכולים לקחת שני ערכים, כלומר יישום / x-www-form-urlencoded ו נתונים מרובי חלקים / טפסים.
2.1. סוג המדיה יישום / x-www-form-urlencoded
HTML לטפסים ערך ברירת המחדל הוא יישום / x-www-form-urlencoded בשביל ה להקליד תְכוּנָה מכיוון שהדבר דואג למקרי השימוש הבסיסיים בהם הנתונים הם לגמרי טקסט. עם זאת, אם מקרה השימוש שלנו כולל תמיכה בנתוני קבצים, נצטרך לבטל אותם בערך נתונים מרובי חלקים / טפסים.
בעיקרו של דבר, הוא שולח את נתוני הטופס כזוגי ערך מפתח המופרדים בתו אמפרסנד (&). כמו כן, המפתח והערך המתאימים מופרדים בסימן השווה (=). יתר על כן, כל התווים השמורים והלא אלפאנומריים מקודדים באמצעות קידוד אחוזים.
3. הגשת טופס בדפדפן
עכשיו, כשיש לנו את היסודות שלנו, בואו ונראה איך אנחנו יכולים לטפל בנתוני טופס מקודדים לכתובת אתר לצורך שימוש פשוט בהגשת משוב באפליקציית רשת אביב.
3.1. מודל תחום
לקבלת טופס המשוב שלנו, עלינו לתפוס את מזהה הדוא"ל של המגיש יחד עם התגובה. אז בואו ניצור את שלנו מודל תחום בא מָשׁוֹב מעמד:
משוב ציבורי בכיתה ציבורית {email String emailId; הערת מחרוזת פרטית; }
3.2. צור טופס
כדי להשתמש בתבנית HTML פשוטה ליצירת טופס האינטרנט הדינמי שלנו, נצטרך להגדיר את Thymeleaf בפרויקט שלנו. לאחר מכן, אנו מוכנים להוסיף א קבל נקודת סיום /מָשׁוֹב שישרת את מָשׁוֹב תצוגה לטופס:
@GetMapping (path = "/ feedback") ציבורי מחרוזת getFeedbackForm (דגם מודל) {משוב משוב = משוב חדש (); model.addAttribute ("משוב", משוב); להחזיר "משוב"; }
שים לב שאנחנו משתמשים מָשׁוֹב כתכונת מודל ללכידת קלט המשתמש. הבא, בואו ליצור אתמָשׁוֹב תצוגה ב feedback.html תבנית:
כמובן, אנחנו לא צריכים לציין במפורש את להקליד כי הוא יבחר בערך ברירת המחדל של יישום / x-www-form-urlencoded.
3.3. זרימת PRG
מכיוון שאנו מקבלים קלט משתמשים באמצעות טופס משוב הדפדפן, עלינו לעשות זאת ליישם את זרימת העבודה של הגשת POST / REDIRECT / GET (PRG) כדי למנוע הגשות כפולות.
ראשית, בוא נבצע את נקודת הקצה של POST / אינטרנט / משוב שישמש כמטפל בפעולת טופס המשוב:
@PostMapping (path = "/ web / feedback", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) ידית מחרוזת ציבורי BrowserSubmissions (משוב משוב) זורק חריג {// שמור נתוני משוב מחזיר "הפניה: / משוב / הצלחה"; }
בשלב הבא נוכל ליישם את נקודת הקצה להפניה מחדש / משוב / הצלחה שמגיש בקשת GET:
@GetMapping ("/ משוב / הצלחה") ResponseEntity ציבורי getSuccess () {להחזיר ResponseEntity חדש ("תודה שהגשת משוב.", HttpStatus.OK); }
כדי לאמת את הפונקציונליות של זרימת העבודה של הגשת טפסים בדפדפן, בואו לבקר localhost: 8080 / משוב:
לבסוף, אנו יכולים גם לבדוק כי נתוני הטופס נשלחים בצורה המקודדת לכתובת האתר:
emailId = abc% 40example.com & תגובה = דוגמה + משוב
4. בקשות שאינן דפדפן
לפעמים, ייתכן שאין לנו לקוח HTTP מבוסס דפדפן. במקום זאת, הלקוח שלנו יכול להיות כלי עזר כמו CURL או דואר. במקרה כזה איננו זקוקים לטופס האינטרנט HTML. במקום זאת, אנו יכולים ליישם א /מָשׁוֹב נקודת קצה המשרתת את בקשת POST:
@PostMapping (path = "/ feedback", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) ציבורי ResponseEntity handNonBrowserSubmissions (@RequestBody Feedback feedback) מעביר חריג {// שמור נתוני משוב מחזיר ResponseEntity חדש ("תודה על הגשת המשוב", HttPatus. ); }
בהיעדר טופס HTML בזרימת הנתונים שלנו, איננו צריכים בהכרח ליישם את דפוס ה- PRG. למרות זאת, עלינו לציין שהמשאב מקבל APPLICATION_FORM_URLENCODED_VALUE סוג המדיה.
לבסוף, אנו יכולים לבדוק זאת באמצעות בקשת CURL:
תלתל -X POST \ // localhost: 8080 / משוב \ -H 'סוג תוכן: יישום / x-www-form-urlencoded' \ -d 'emailId = abc% 40example.com & comment = דוגמה% 20Feedback'
4.1. FormHttpMessageConverter יסודות
בקשת HTTP שנשלחת יישום / x-www-form-urlencoded הנתונים חייבים לציין זאת ב סוג תוכן כּוֹתֶרֶת. באופן פנימי, אביב משתמש ב- FormHttpMessageConverter בכיתה לקרוא נתונים אלה ולקשר אותם באמצעות פרמטר השיטה.
במקרים בהם פרמטר השיטה שלנו הוא מסוג MultiValueMap, נוכל להשתמש ב- @RequestParam אוֹ @ בקשת גוף ביאור כדי לאגד אותו כראוי לגוף בקשת ה- HTTP. הסיבה לכך היא ש- API של Servlet משלב את פרמטרי השאילתה ונתוני הטופס למפה אחת הנקראת פרמטרים, וזה כולל ניתוח אוטומטי של גוף הבקשה:
@PostMapping (path = "/ feedback", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) מטפל ציבורי ב- ResponseEntityNonBrowserSubmissions (@RequestParam MultiValueMap paramMap) זורק חריג {// שמור נתוני משוב מחזיר תגובה חדשה ResponseEntity ("תודה על הגשת משוב Http. ); }
למרות זאת, עבור פרמטר שיטה מסוג אחר מלבד MultiValueMap, כגון שלנו מָשׁוֹב אובייקט תחום, עלינו להשתמש רק ב- @ בקשת גוף ביאור.
5. מסקנה
במדריך זה למדנו בקצרה על קידוד של נתוני טופס בטופסי אינטרנט. בדקנו גם כיצד לטפל בנתונים מקודדים לכתובות אתרים לבקשות HTTP בדפדפן ולא בדפדפן על ידי הטמעת טופס משוב באפליקציית רשת Spring Boot.
כמו תמיד, קוד המקור השלם להדרכה זמין ב- GitHub.
REST תחתון