שיטת הבקשה אינה נתמכת (405) באביב

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

מאמר מהיר זה מתמקד בשגיאה נפוצה - 'שיטת הבקשה אינה נתמכת - 405' - שעומדים בפני מפתחים בעת חשיפת ה- APIs שלהם עבור פעלים ספציפיים ל- HTTP, עם Spring MVC.

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

2. יסודות שיטת הבקשה

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

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

בצורה מאוד פשוטה, שיטות MTP HTTP הן פעולות בסיסיות שבקשה יכולה להפעיל בשרת. לדוגמא, כמה שיטות לְהָבִיא את הנתונים מהשרת, חלקם שלח נתונים לשרת, חלקם עשויים לִמְחוֹק הנתונים וכו '.

ה ביאור @ RequestMapping מציין את השיטות הנתמכות לבקשה.

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

האביב DispatcherServlet תומך בכולם כברירת מחדל למעט אפשרויות ו זֵכֶר; @ בקשת מיפוי משתמש ב- RequestMethod enum כדי לציין אילו שיטות נתמכות.

3. תרחיש MVC פשוט

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

@RestController @RequestMapping (value = "/ api") מחלקה ציבורית RequestMethodController {@ שירות עובד עובד פרטי פרטי; @RequestMapping (value = "/ עובדים", מייצר = "application / json") ציבורי רשימה findEmployees () זורק InvalidRequestException {return service.getEmployeeList (); }}

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

אנו יכולים לבקש את ה- API בשיטות נתמכות שונות, למשל באמצעות סלסול:

$ curl --request POST // localhost: 8080 / api / עובדים [{"id": 100, "name": "Steve Martin", "contactNumber": "333-777-999"}, {"id": 200, "name": "Adam Schawn", "contactNumber": "444-111-777"}]

באופן טבעי, אנו יכולים לשלוח את הבקשה במספר דרכים - באמצעות פשוט סִלְסוּל פיקוד, דוור, AJAX וכו '.

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

4. תרחיש הבעיה - HTTP 405

אבל מה שנדון כאן הוא - כמובן - התרחישים שבהם הבקשה לא תצליח.

שיטה 405 אינה מותרת'היא אחת השגיאות הנפוצות ביותר שאנו צופים בעבודה עם בקשות האביב.

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

@RequestMapping (value = "/ עובדים", מייצר = "application / json", method = RequestMethod.GET) ציבורי רשימה findEmployees () {...} // שלח את בקשת ה- PUT באמצעות CURL $ curl - בקשת PUT // localhost: 8080 / api / עובדים {"חותמת זמן": 1539720588712, "status": 405, "error": "שיטה אינה מותרת", "חריג": "org.springframework.web.HttpRequestMethodNotSupportedException", "הודעה": "בקשה השיטה 'PUT' אינה נתמכת "," path ":" / api / workers "} 

5. 405 לא תומך - סיבה, פיתרון

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

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

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

@RequestMapping (value = "/ עובדים", מייצר = "יישום / json", שיטה = {RequestMethod.GET, RequestMethod.PUT}) ...

לחלופין, אנו יכולים להגדיר את השיטה / המיפוי החדשים בנפרד:

@RequestMapping (value = "/ עובדים", מייצר = "application / json", method = RequestMethod.PUT) ציבורי רשימת פועלים עובדים () ... 

6. מסקנה

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

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


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