PracticU

גלישה ל-Route שאינו קיים

בלי כתוביותעם כתוביות
PracticU › קורס דוט-נט - NET Core. - עם Rest API › גלישה ל-Route שאינו קיים
גלישה ל-Route שאינו קיים
פתיחת מודול הטיפול בשגיאות ב-REST API של ספרים: איך לגרום לשרת להחזיר הודעה ברורה ו-404 כשהלקוח גולש לכתובת שלא קיימת, במקום תשובה ריקה.
הבעיה
גלישה ל-get all books מחזירה את כל הספרים, אבל גלישה לכתובת שלא קיימת מחזירה status code 404 בלי שום הודעה ליוזר. בקשה לספר שלא קיים (קוד 15) מחזירה 204 no content במקום 404. עד כה בנינו הכול כמו שצריך, אבל לא טיפלנו במצבי שגיאה.
השלבים העיקריים
1. קובץ errors במודלים: מכיל סדרה של מחלקות קטנות לסוגי השגיאות.
2. מחלקה אבסטרקטית base error: מחזיקה string message עם הודעת השגיאה, וקונסטרקטור שמקבל message ומאכלס אותו.
3. מחלקה route not found error: יורשת מ-base error. הקונסטרקטור מקבל את ה-method (כי route יכול להיות קיים ב-post אבל לא ב-get) ואת ה-route שהיוזר ניסה לגלוש אליו, ומרכיב הודעה שה-route לא קיים על ה-method.
4. controller ייעודי: מחלקה בקובץ נפרד, route not found controller, כי הוא לא שייך לאף controller אחר, ופונקציה public IActionResult שמחזירה NotFound עם אובייקט השגיאה. את ה-method לוקחים מ-HttpContext.Request.Method, אובייקט שמגיע מ-Controller Base ומתאר את ה-Request הנוכחי.
5. ה-route עם כוכביות: כשכותבים **route ה-route תופס כל כתובת אחרת. המערכת מחפשת route מתאים בכל ה-controllers והפעולות, והאחרון בתור הוא זה שתופס מה שלא נמצא קודם. הכתובת שהיוזר גלש אליה נכנסת למשתנה route ומשמשת לבניית ההודעה.
6. בדיקה: גלישה לכתובת שלא קיימת מחזירה 404 עם הודעה על ה-route וה-method (Get), וגלישה ל-route שקיים עובדת כרגיל.
שימו לב
בהרצה הראשונה לא התקבלה ההודעה, והסיבה הייתה שהכוכביות חסרו או לא נכתבו נכון. אחרי התיקון זה עבד. המרצה גילה שבמערכת הזו כוכבית אחת עובדת גם כן, אז אפשר להשאיר אחת או שתיים.
אחרי הסרטון תוכלו להחזיר 404 עם הודעה בעלת משמעות על כל route שלא קיים ב-REST API שלכם.
השיעור הבא בקורס: גלישה למשאב שאינו קיים

פרקי ההרצאה: גלישה ל-Route שאינו קיים

  1. 00:00

    מודול הטיפול בשגיאות

  2. 00:41

    זיהוי בעיות 404 ו-204

  3. 01:39

    בניית מחלקות השגיאות

  4. 02:38

    מחלקת RouteNotFoundError

  5. 03:36

    הרכבת הודעת השגיאה

  6. 04:29

    אופן התאמת ה-route

  7. 05:39

    בניית RouteNotFoundController

תמלול ההרצאה: גלישה ל-Route שאינו קיים

הטקסט המלא של הדקות הראשונות בהרצאה «גלישה ל-Route שאינו קיים» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

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

  2. 00:13

    אם אני עכשיו גולש ל-get all books לדוגמה, אז אני מקבל את כל הספרים והכול בסדר. אבל מה קורה אם היוזר או מישהו אחר מנסה לגלוש לאיזשהו מקום שלא קיים, לדוגמה לכתובת הזאת?

  3. 00:27

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

  4. 00:46

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

  5. 00:57

    יוזר מנסה לקבל ספר עם קוד אחד והשרת אומר, "בבקשה קח, הנה." אבל אם אני רוצה לקבל קוד חמש עשרה ואין לי, אז אני רואה שאני מקבל מאתיים וארבע no content במקום ארבע מאות וארבע שזה אמור להיות not found.

  6. 01:14

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

  7. 01:29

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

  8. 01:53

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

  9. 02:12

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

  10. 02:25

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

  11. 02:50

    בואו נירש את base error, כי כל השגיאות שאנחנו מתעסקים איתן יש להן מינימום message, וכאן אנחנו רוצים איזשהו קונסטרקטור שמקבל מידע לגבי מה זה אומר route not found.

  12. 03:06

    האמת, בואו נקרא לזה route not found error בצורה כזאת, ואנחנו נקבל string method. איזה method המשתמש גלש שבו ה-route לא נמצא, כי אם המשתמש נניח הולך לגלוש ל-books עם שלושה S-ים בסוף אולי אין לי את זה ב-get, אבל כן יש לי את זה ב-post.

  13. 03:26

    לכן אנחנו צריכים לתאר איזה method ה-route לא נמצא לגביו ומי ה-route עצמו שמנסים לגלוש אליו. זאת ההודעה שאנחנו רוצים בעצם להחזיר למשתמש.

  14. 03:39

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

  15. 03:53

    איזה route שהיוזר, אה, מנסה לגלוש אליו. on method, בלה, בלה. אותה method שהיוזר השתמש בה. Not exist. שמע, לא קיים לי route כזה.

  16. 04:04

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

  17. 04:23

    זה שבנינו את המחלקה הזאת כבר אומר שהיוזר יקבל את ההודעת שגיאה הזאת? ממש לא. בואו נראה. גלשתי פה ב-get למשהו שלא קיים, וכמובן אני מקבל כלום.

  18. 04:34

    אז איך אנחנו גורמים ל-REST API שבנינו להחזיר בדיוק את ההודעה הזאת? מאוד פשוט. מה קורה בעצם כשהיוזר גולש ל-route? כשהיוזר גולש ל-route מסוים, בואו נניח הוא גולש ל-route books אז המערכת אומרת, "טוב, בואו נתחיל לחפש בכל ה-controllers שיש לנו," כרגע יש לנו רק אחד.

  19. 04:53

    בכל ה-controllers איפה יש route שמתאים לנו. קודם כל יש לנו פה http get, והנה אנחנו רואים bool route שמתאים ל-api books. הנה ה-api books, ולכן ה-route הזה נלקח.

  20. 05:04

    אם היו שני routes מבחינת המערכת, אז כמובן זאת הייתה שגיאה. לא היינו יכולים להריץ את זה. ואם ה-route הזה לא נמצא, אז עוברים לבא בתור ומחפשים את הפורמט הזה.

  21. 05:15

    לא נמצא, עוברים לבא בתור וכדומה עד שמסיימים את ה-controller, ואז עוברים ל-controller הבא, הבא, הבא, ואם כל ה-controllers לא מכילים את ה-method וה-route המתאים אז מתבצעת אותה שגיאה שראינו מקודם.

  22. 05:28

    אבל יש עוד controller אחד מעניין שאנחנו יכולים לבנות. למעשה לא חייבים לבנות controller בשבילו, אבל אני אוהב לבנות controller כי הוא לא שייך לאף controller אחר.

  23. 05:37

    בואו רגע נ-נצרף controller. מה זאת אומרת לא חייבים לבנות controller? אנחנו יכולים לעשות את זה באחד ה-controllers הקיימים. אז ניגש לפה, נבנה controller חדש, שזה הדבר היותר נכון לדעתי, ובואו נפ-נקרא ל-controller הזה route not found controller.

  24. 05:55

    go. ניפטר פה מהזנבות של ה-namespace, ניפטר מזה שאנחנו תמיד מ-נפטרים ומזה, ויש לנו controller מיוחד ל-route שלא קיים. ואנחנו רוצים לבנות public IAction Result

ההרצאה הקודמת: יצירת Interceptor - עבור מסד הנתונים

ההרצאה הבאה: גלישה למשאב שאינו קיים

הרצאות קשורות מקורסים אחרים

  • גלישה באינטרנט עם כתובת IPv6
  • ביצוע ולידציה על Route Parameters
  • ריאקט - Blocking Backend Route
  • ניתוב סטטי - Static Route

קורסים נוספים במסלול

  • קורס Entity Framework Core - עבודה עם מסד נתונים בדוט-נט
  • קורס ASP.NET
  • קורס MVC
  • קורס Git ו-GitHub עם Visual Studio