אביב JSON-P עם ג'קסון

REST למעלה

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס ג'קסון טופ

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

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

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

דרך אחת ל הרפו את הגבלת הדפדפן הזו כאשר עובדים עם נתוני JSON - הוא באמצעות JSON עם ריפוד (JSON-P).

מאמר זה דן בתמיכה של אביב בעבודה עם נתוני JSON-P - בעזרת תקציר JsonpResponseBodyAdvice.

2. JSON-P בפעולה

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

2.1. הכנה

בדוגמאות שלנו נשתמש בפשטות זו חֶברָה מעמד:

חברה ממעמד ציבורי {מזהה פרטי ארוך; שם מחרוזת פרטי; // סטרים וקובעים סטנדרטיים} 

מחלקה זו תחייב את פרמטרי הבקשה ותוחזר מהשרת כייצוג JSON.

שיטת הבקר היא גם יישום פשוט - החזרת ה- חֶברָה למשל:

@RestController מחלקה ציבורית CompanyController {@RequestMapping (value = "/ companyRest", מייצר = MediaType.APPLICATION_JSON_VALUE) חברה ציבורית getCompanyRest () {חברה חברה = חברה חדשה (1, "Xpto"); חברת השבה; }}

בצד הלקוח אנו יכולים להשתמש jQuery ספרייה ליצור ולשלוח בקשת AJAX:

$ .ajax ({url: '// localhost: 8080 / spring-mvc-java / companyRest', נתונים: {פורמט: 'json'}, סוג: 'GET', ...});

שקול בקשת AJAX כנגד כתובת האתר הבאה:

// localhost: 8080 / spring-mvc-java / companyRest 

התגובה מהשרת תהיה הבאה:

{"id": 1, "name": "Xpto"}

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

2.2. בקשת מוצא

על ידי שינוי כתובת ה- URL לבקשה:

//127.0.0.1:8080/spring-mvc-java/companyRest 

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

עם JSON-P, אנו יכולים להוסיף פרמטר להתקשרות חוזרת לבקשה:

//127.1.1.1:8080/spring-mvc-java/companyRest?callback=getCompanyData 

בצד הלקוח זה קל כמו להוסיף את הפרמטרים הבאים לבקשת AJAX:

$ .ajax ({... jsonpCallback: 'getCompanyData', dataType: 'jsonp', ...});

ה getCompanyData תהיה הפונקציה הנקראת כאשר התגובה תתקבל.

אם השרת מעצב את התגובה באופן הבא:

getCompanyData ({"id": 1, "name": "Xpto"}); 

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

3. @ControllerAdvice ביאור

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

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

4. שינוי התגובה באמצעות תקציר JsonpResponseBodyAdvice

החל גם באביב 4.1, כעת יש לנו גישה ל- תקציר JsonpResponseBodyAdvice class - שמגבש את התגובה על פי תקני JSON-P.

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

על מנת לאפשר תמיכה באביב ב- JSON-P, נתחיל בתצורה:

@ControllerAdvice מחלקה ציבורית JsonpControllerAdvice מרחיב את AbstractJsonpResponseBodyAdvice {public JsonpControllerAdvice () {super ("callback"); }} 

התמיכה נעשית באמצעות תקציר JsonpResponseBodyAdvice מעמד. המפתח שהועבר לשיטת העל הוא זה שישמש בכתובת URL המבקשת נתוני JSON-P.

עם ייעוץ בקר זה, אנו ממירים את התגובה באופן אוטומטי ל- JSON-P.

5. JSON-P עם אביב בפועל

עם התצורה שנדונה בעבר, אנו מסוגלים לגרום ליישומי ה- REST שלנו להגיב באמצעות JSON-P. בדוגמה הבאה נחזיר את נתוני החברה, כך שכתובת האתר שלנו לבקשת AJAX צריכה להיות בערך כך:

//127.0.0.1:8080/spring-mvc-java/companyRest?callback=getCompanyData 

כתוצאה מהתצורה הקודמת, התגובה תיראה כך:

getCompanyData ({"id": 1, "name": "Xpto"});

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

ה ייעוץ JsonpController ניתן ליישם בקלות על כל שיטה שמחזירה תגובה עם הערות @ResponseBody ו תגובה תגובה.

צריכה להיות פונקציה עם אותו שם שהועבר בקולבק, getCompanyData, לטיפול בכל התגובות.

6. מסקנה

מאמר מהיר זה מראה כיצד עבודה מייגעת אחרת של עיצוב התגובה לניצול JSON-P מפשטת באמצעות הפונקציונליות החדשה באביב 4.1.

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

REST תחתון

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס תחתון ג'קסון

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס