משא ומתן בנושא MVC באביב

1. סקירה כללית

מאמר זה מתאר כיצד ליישם משא ומתן לתוכן בפרויקט MVC באביב.

באופן כללי, יש שלוש אפשרויות לקביעת סוג המדיה של בקשה:

  • שימוש בסיומות URL (הרחבות) בבקשה (למשל .xml / .json)
  • שימוש בפרמטר URL בבקשה (למשל ? format = json)
  • באמצעות לְקַבֵּל כותרת בבקשה

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

2. אסטרטגיות למשא ומתן על תוכן

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

 com.fasterxml.jackson.core jackson-core 2.10.2 com.fasterxml.jackson.core jackson-databind 2.10.2 

לתמיכה ב- XML, אנו יכולים להשתמש ב- JAXB, XStream או בתמיכה החדשה יותר של ג'קסון- XML.

מאז הסברנו את השימוש ב- לְקַבֵּל כותרת במאמר קודם על HttpMessageConverters, בואו נתמקד בשתי האסטרטגיות הראשונות לעומק.

3. אסטרטגיית הסיומת של כתובות אתרים

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

לפני שנכנס לתצורות, בואו נסתכל במהירות על דוגמא. יש לנו את הטמעת שיטת ה- API הפשוטה הבאה בבקר טיפוסי של אביב:

@RequestMapping (value = "/ עובד / {id}", מייצר = {"application / json", "application / xml"}, method = RequestMethod.GET) ציבור @ResponseBody עובד getEmployeeById (@PathVariable מזהה ארוך) {החזר עובד מפה .get (id); } 

בואו נפעיל אותו תוך שימוש בתוסף JSON כדי לציין את סוג המדיה של המשאב:

תלתל //localhost:8080/spring-mvc-basics/employee/10.json

הנה מה שאנחנו עשויים לחזור אם נשתמש בתוסף JSON:

{"id": 10, "name": "עובד בבדיקה", "contactNumber": "999-999-9999"}

וככה תיראה התגובה לבקשה עם XML:

תלתל //localhost:8080/spring-mvc-basics/employee/10.xml

גוף התגובה:

 999-999-9999 10 עובד מבחן 

עַכשָׁיו, אם איננו משתמשים בתוסף כלשהו או השתמש באחד שלא מוגדר, סוג התוכן המוגדר כברירת מחדל יוחזר:

תלתל // localhost: 8080 / spring-mvc-basics / עובד / 10

בואו נסתכל כעת על הגדרת אסטרטגיה זו - עם תצורות Java ו- XML.

3.1. תצורת Java

public void configureContentNegotiation (תצורת התוכן ContentNegotiationConfigurer) {configurer.favorPathExtension (true). favorParameter (שקר). ignoreAcceptHeader (נכון). useJaf (שקר). defaultContentType (MediaType.APPLICATION_JSON); }

בוא נעבור על הפרטים.

ראשית, אנו מאפשרים את אסטרטגיית הרחבות הנתיבים. ראוי גם להזכיר כי החל מסגרת האביב 5.2.4, ה- favorPathExtension (בוליאני) שיטת הוצא משימוש על מנת להרתיע את השימוש בהרחבות נתיב למשא ומתן על תוכן.

לאחר מכן, אנו משביתים את אסטרטגיית פרמטר ה- URL וכן את לְקַבֵּל אסטרטגיית כותרת ראשית - מכיוון שאנחנו רוצים להסתמך רק על דרך הרחבת הנתיב לקביעת סוג התוכן.

לאחר מכן אנו מכבים את מסגרת ההפעלה של Java; ניתן להשתמש ב- JAF כמנגנון נסיגה לבחירת פורמט הפלט אם הבקשה הנכנסת אינה תואמת את אחת מהאסטרטגיות שקבענו. אנו משביתים אותה מכיוון שנגדיר את תצורת JSON כסוג התוכן המוגדר כברירת מחדל. שים לב ש ה useJaf () השיטה הוצאה משימוש החל ממסגרת האביב 5.

ולבסוף - אנו מגדירים את JSON כברירת המחדל. פירוש הדבר שאם אף אחת משתי האסטרטגיות לא תואמת, כל הבקשות הנכנסות ימופו לשיטת בקר המשרתת את JSON.

3.2. תצורת XML

בואו נסתכל במהירות על אותה תצורה מדויקת, אך ורק באמצעות XML:

4. אסטרטגיית פרמטרים של כתובות אתרים

השתמשנו בהרחבות נתיבים בסעיף הקודם - בואו נגדיר את אביב MVC לשימוש בפרמטר נתיב.

אנו יכולים לאפשר אסטרטגיה זו על ידי הגדרת הערך של ה- favorParameter נכס לאמיתי.

בואו נסתכל במהירות על איך זה יעבוד עם הדוגמה הקודמת שלנו:

תלתל // localhost: 8080 / spring-mvc-basics / עובד / 10? mediaType = json

והנה מה יהיה גוף התגובה של JSON:

{"id": 10, "name": "עובד בבדיקה", "contactNumber": "999-999-9999"}

אם אנו משתמשים בפרמטר XML, הפלט יהיה בצורת XML:

תלתל // localhost: 8080 / spring-mvc-basics / עובד / 10? mediaType = xml

גוף התגובה:

 999-999-9999 10 עובד מבחן 

עכשיו בואו נעשה את התצורה - שוב, תחילה באמצעות Java ואז ב- XML.

4.1. תצורת Java

public void configureContentNegotiation (התצורה של ContentNegotiationConfigurer) {configurer.favorPathExtension (false). favorParameter (נכון). parameterName ("mediaType"). ignoreAcceptHeader (נכון). useJaf (שקר). defaultContentType (MediaType.APPLICATION_JSON). mediaType ("xml", MediaType.APPLICATION_XML). mediaType ("json", MediaType.APPLICATION_JSON); } 

בואו לקרוא את התצורה הזו.

ראשית, כמובן, הארכת השביל וה לְקַבֵּל אסטרטגיות כותרות מושבתות (כמו גם JAF).

שאר התצורה זהה.

4.2. תצורת XML

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

public void configureContentNegotiation (התצורה של ContentNegotiationConfigurer) {configurer.favorPathExtension (true). favorParameter (נכון). parameterName ("mediaType"). ignoreAcceptHeader (נכון). useJaf (שקר). defaultContentType (MediaType.APPLICATION_JSON). mediaType ("xml", MediaType.APPLICATION_XML). mediaType ("json", MediaType.APPLICATION_JSON); }

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

5. ה לְקַבֵּל אסטרטגיית כותרת

אם ה לְקַבֵּל כותרת מופעלת, Spring MVC יחפש את ערכה בבקשה הנכנסת לקביעת סוג הייצוג.

עלינו לקבוע את הערך של ignoreAcceptHeader לשקר כדי לאפשר גישה זו ואנחנו משביתים את שתי האסטרטגיות האחרות רק כדי שנדע שאנחנו מסתמכים רק על ה- לְקַבֵּל כּוֹתֶרֶת.

5.1. תצורת Java

public void configureContentNegotiation (תצורת התוכן ContentNegotiationConfigurer) {configurer.favorPathExtension (true). favorParameter (שקר). parameterName ("mediaType"). ignoreAcceptHeader (שקר). useJaf (שקר). defaultContentType (MediaType.APPLICATION_JSON). mediaType ("xml", MediaType.APPLICATION_XML). mediaType ("json", MediaType.APPLICATION_JSON); }

5.2. תצורת XML

לבסוף, עלינו להפעיל את מנהל משא ומתן התוכן על ידי תוספת לתצורה הכוללת:

6. מסקנה

וסיימנו. בדקנו כיצד עובד משא ומתן על תוכן באביב MVC והתמקדנו בכמה דוגמאות להגדרת השימוש באסטרטגיות שונות לקביעת סוג התוכן.

היישום המלא של מאמר זה ניתן למצוא באתר GitHub.