שימוש באביב ResponseEntity כדי לטפל בתגובת HTTP

1. הקדמה

באמצעות Spring, בדרך כלל יש לנו דרכים רבות להשיג את אותה מטרה, כולל כיוונון תגובות HTTP.

במדריך קצר זה נראה כיצד להגדיר את הגוף, הסטטוס והכותרות של תגובת HTTP באמצעות תגובה תגובה.

2. תגובה תגובה

תגובה תגובהמייצג את כל תגובת ה- HTTP: קוד סטטוס, כותרות וגוף. כתוצאה מכך, אנו יכולים להשתמש בו כדי להגדיר באופן מלא את תגובת ה- HTTP.

אם אנו רוצים להשתמש בו, עלינו להחזיר אותו מנקודת הקצה; האביב דואג לשאר.

תגובה תגובה הוא טיפוס גנרי. כתוצאה מכך, אנו יכולים להשתמש בכל סוג שהוא כגוף התגובה:

@GetMapping ("/ שלום") ResponseEntity שלום () {להחזיר ResponseEntity חדש ("שלום עולם!", HttpStatus.OK); }

מכיוון שאנו מציינים את מצב התגובה באופן פרוגרמטי, אנו יכולים לחזור עם קודי סטטוס שונים לתרחישים שונים:

@GetMapping ("/ age") ResponseEntity age (@RequestParam ("yearOfBirth") int yearOfBirth) {if (isInFuture (yearOfBirth)) {return new ResponseEntity ("שנת הלידה לא יכולה להיות בעתיד", HttpStatus.BAD_REQUEST); } להחזיר ResponseEntity חדש ("הגיל שלך הוא" + calcAge (yearOfBirth), HttpStatus.OK); }

בנוסף, אנו יכולים להגדיר כותרות HTTP:

@GetMapping ("/ customHeader") ResponseEntity customHeader () {HttpHeaders headers = HttpHeaders new (); headers.add ("כותרת מותאמת אישית", "foo"); להחזיר ResponseEntity חדש ("ערכת כותרת מותאמת אישית", כותרות, HttpStatus.OK); }

יתר על כן, תגובה תגובהמספק שני ממשקי בונה מקוננים: HeadersBuilder וממשק המשנה שלה, בונה גוף. לכן, אנו יכולים לגשת ליכולות שלהם באמצעות השיטות הסטטיות של תגובה תגובה.

המקרה הפשוט ביותר הוא תגובה עם גוף תגובה וקוד תגובה HTTP 200:

@GetMapping ("/ שלום") ResponseEntity שלום () {return ResponseEntity.ok ("שלום עולם!"); }

לקבלת קודי הסטטוס הפופולריים ביותר של HTTP אנו מקבלים שיטות סטטיות:

BodyBuilder התקבל (); BodyBuilder badRequest (); נוצר BodyBuilder (מיקום java.net.URI); HeadersBuilder noContent (); HeadersBuilder notFound (); BodyBuilder בסדר ();

בנוסף, אנו יכולים להשתמש ב- מצב BodyBuilder (סטטוס HttpStatus) וה סטטוס BodyBuilder (סטטוס int) שיטות להגדרת כל מצב HTTP.

לבסוף, עם ResponseEntity BodyBuilder.body (גוף T) אנו יכולים להגדיר את גוף תגובת HTTP:

@GetMapping ("/ age") ResponseEntity age (@RequestParam ("yearOfBirth") int yearOfBirth) {if (isInFuture (yearOfBirth)) {return ResponseEntity.badRequest () .body ("שנת הלידה לא יכולה להיות בעתיד") ; } החזר ResponseEntity.status (HttpStatus.OK) .body ("הגיל שלך הוא" + calcAge (yearOfBirth)); }

אנו יכולים גם להגדיר כותרות מותאמות אישית:

@GetMapping ("/ customHeader") ResponseEntity customHeader () {return ResponseEntity.ok () .header ("כותרת מותאמת אישית", "foo"). גוף ("סט כותרת מותאמת אישית"); }

מאז BodyBuilder.body () מחזירה א תגובה תגובה במקום בונה גוף, זו צריכה להיות השיחה האחרונה.

שים לב שעם HeaderBuilder איננו יכולים להגדיר שום מאפיין של גוף התגובה.

תוך כדי החזרה תגובה תגובה אובייקט מהבקר, אנו עשויים לקבל חריג או שגיאה בעת עיבוד הבקשה ונרצה להחזיר מידע הקשור לשגיאה למשתמש המיוצג כסוג אחר, נניח E.

אביב 3.2 מביא תמיכה בכל העולם @ExceptionHandler עם החדש @ControllerAdvice ביאור, המטפל בתרחישים מסוג זה. לפרטים מעמיקים, עיין במאמר הקיים שלנו כאן.

בזמן תגובה תגובה הוא חזק מאוד, אנחנו לא צריכים להשתמש בו יתר על המידה. במקרים פשוטים, ישנן אפשרויות נוספות המספקות את צרכינו והן גורמות לקוד נקי הרבה יותר.

3. חלופות

3.1. @ResponseBody

ביישומי MVC קלאסיים של Spring, נקודות קצה מחזירות בדרך כלל דפי HTML שניתנו. לפעמים אנחנו צריכים להחזיר רק את הנתונים בפועל; לדוגמא, כאשר אנו משתמשים בנקודת הקצה עם AJAX.

במקרים כאלה אנו יכולים לסמן את שיטת מטפל הבקשות באמצעות @ResponseBody, ו אביב מתייחס לערך התוצאה של השיטה כאל גוף תגובת HTTP את עצמה.

למידע נוסף, מאמר זה הוא מקום טוב להתחיל בו.

3.2. @ תגובה סטטוס

כאשר נקודת קצה חוזרת בהצלחה, Spring מספק תגובה HTTP 200 (OK). אם נקודת הקצה מציגה חריג, Spring מחפש מטפל חריג שמספר באיזה מצב HTTP להשתמש.

אנו יכולים לסמן שיטות אלה באמצעות @ResponseStatus, ולכן, Spring חוזר עם סטטוס HTTP מותאם אישית.

לקבלת דוגמאות נוספות, בקר במאמר שלנו אודות קודי סטטוס מותאמים אישית.

3.3. נהל את התגובה באופן ישיר

האביב מאפשר לנו גם לגשת ל javax.servlet.http.HttpServletResponse התנגד ישירות; עלינו להכריז על כך רק כטיעון שיטה:

@GetMapping ("/ manual") ידני בטל (תגובת HttpServletResponse) זורק IOException {response.setHeader ("כותרת מותאמת אישית", "foo"); response.setStatus (200); response.getWriter (). println ("שלום עולם!"); }

מאז אביב מספק הפשטות ויכולות נוספות מעל ליישום הבסיסי, אנחנו לא צריכים לתפעל את התגובה בדרך זו.

4. מסקנה

במאמר זה דנו בדרכים מרובות לתפעל את תגובת ה- HTTP באביב ובדקנו את היתרונות והחסרונות שלהם.

כרגיל, הדוגמאות זמינות ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found