PracticU

הוצאת הודעות השגיאה
מתוך ModelState

בלי כתוביותעם כתוביות
PracticU › קורס דוט-נט - NET Core. - עם Rest API › הוצאת הודעות השגיאה מתוך ModelState
הוצאת הודעות השגיאה מתוך ModelState
האובייקט ModelState מורכב, והסרטון מפרק אותו כדי לשלוף ממנו את הודעות השגיאה האמיתיות ולהחזיר אותן ללקוח, וגם מראה איך להפוך את הקוד לפונקציית הרחבה שאפשר להשתמש בה בכל controller.
איך ModelState בנוי
1. פונקציית עזר: פונקציה פרטית שמחזירה string, ומקבלת ModelStateDictionary (המאפיין ModelState ב-controller נשלח אליה).
2. Dictionary: collection שבו כל פריט הוא key ו-value. כאן ה-key הוא string עם שם המאפיין, וה-value הוא ModelStateEntry. בלולאת foreach רואים רק מאפיינים שנכשלו בוולידציה: כשלא היו title ו-price תקין, הקונסול הציג את שניהם ולא את description.
3. שגיאות לכל מאפיין: ל-value יש collection נוסף, Errors, כי מאפיין אחד יכול להיכשל בכמה בדיקות (למשל max length וגם אות גדולה). לולאה פנימית על value.errors נותנת ErrorMessage לכל שגיאה.
4. איסוף למחרוזת אחת: מתחילים ב-errors ריק, מוסיפים כל ErrorMessage עם רווח, ומחזירים עם Trim. התוצאה "Book price must be zero to 100. Missing book title." מוחזרת ב-BadRequest במקום something bad.
פונקציית הרחבה
1. מחלקת עזר סטטית: הפונקציה עברה למחלקה ב-utils (קודם Helper), שחייבת להיות static, כדי לקרוא לה מכל controller.
2. המילה this: כשמוסיפים this לפני הפרמטר, אפשר לכתוב ModelState.GetAllErrors() במקום Helper.GetAllErrors(ModelState). זה Extension Function, ו"קסם של ה-compiler" מחליף את הקריאה. לכן שינו את שם המחלקה ל-Extensions.
3. שגיאה ראשונה בלבד: GetFirstError מחזירה רק שגיאה אחת, כך שהשרת עובד מהר יותר והלקוח מתקן ומנסה שוב. אפשר גם בשורה אחת: ModelState.Values.Where(...) שיש להם errors, אחר כך First ו-ErrorMessage. הבדיקה נחוצה כי נתקלו ב-value בלי errors.
שימו לב
1. PATCH: הפונקציה בודקת את כל המודל, אז ב-UpdateBookPrice (patch) נכשל על title שחסר. הפתרון שהמרצה מצא הוא ModelState.Remove על title ועל description, ונשאר רק price. הוא מציין שזה לא אלגנטי ושלכן פחות מתכנתים אוהבים patch. אפשר גם לבדוק את המחיר ידנית, אבל זה משכפל בדיקות.
2. Add, Update, UpdatePrice: בכולם הוסיפו את הבדיקה. ב-Delete אין צורך כי מקבלים רק ID.
אחרי הסרטון תוכלו להחזיר מ-REST API את הודעות הוולידציה שהגדרתם, כמחרוזת אחת או כשגיאה הראשונה בלבד.
השיעור הבא בקורס: יצירת מאפיין וולידציה Custom Validator
מילון מושגים:
מאפיין – תכונה שמצמידים לרכיב ומתארת אותו או את התנהגותו, למשל מאפיין של תגית HTML או שדה באובייקט.
Dictionary – מבנה נתונים שמאחסן זוגות של מפתח וערך, ומאפשר שליפה מהירה של ערך לפי מפתחו.
קומפיילר – תוכנה שממירה קוד מקור שנכתב בשפת תכנות לקוד שהמחשב יכול להריץ, ומדווחת על שגיאות תחביר.
עדכון אבטחה – עדכון תוכנה ממוקד שמתקן תקלה או סוגר חולשת אבטחה בגרסה קיימת.
מודל – רכיב שמייצג את הנתונים ואת הלוגיקה העסקית באפליקציה; גם ייצוג מופשט של מערכת או תהליך.
DELETE – פקודת SQL למחיקת שורות מטבלה; גם שיטת HTTP לבקשת מחיקה של משאב בשרת.
REST – סגנון לבניית ממשקי API מעל HTTP, המבוסס על משאבים ועל שיטות סטנדרטיות כמו GET ו-POST.
API – ממשק תכנותי שמגדיר כיצד תוכנה אחת פונה לאחרת ומחליפה איתה נתונים ופעולות.

פרקי ההרצאה: הוצאת הודעות השגיאה מתוך ModelState

  1. 00:00

    הבנת מבנה ה-model state

  2. 00:38

    פונקציית עזר להחזרת כל השגיאות

  3. 01:30

    מעבר על ה-dictionary בלולאה

  4. 02:28

    ה-key וה-value של פריט שנכשל

  5. 03:07

    הצגת המאפיינים שנכשלו

תמלול ההרצאה: הוצאת הודעות השגיאה מתוך ModelState

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

  1. 00:02

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

  2. 00:19

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

  3. 00:41

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

  4. 01:01

    אוקיי, מעולה. אז בואו נכתוב פה model state dictionary ונקרא לו model state עם m קטנה, כי זה משתנה לוקאלי של הפונקציה. המאפיין נקרא Model State עם M גדולה, אבל אפשר עכשיו לשלוח את הדבר הזה, Model State עם M גדולה, לפה, ל-model state עם m קטנה והוא יחזיר לנו כאן את כל הודעות השגיאה שקיימות בתוכו.

  5. 01:24

    מה זה dictionary? Dictionary זה collection שבו כל פריט מכיל key ו-value. אוקיי? key ייחודי ואיזשהו value שמתאר משהו.

  6. 01:33

    אז איך אנחנו מחזירים את כל השגיאות? דבר ראשון בואו ניקח string errors ונתחיל אותו במחרוזת ריקה. בסוף בסוף אנחנו רוצים to return errors בצורה כזאת, ומבין לבין אנחנו רוצים לרוץ על ה-collection הזה, זה סך הכול collection, ולאסוף ממנו את כל השגיאות.

  7. 01:54

    איך אני רץ על collection של dictionary? For each. כל פריט ב-collection זה בעצם item ואני רוצה שהוא יהיה, שהוא ירוץ על ה-model state הזה שפה.

  8. 02:10

    אז אם אני עכשיו בא ואומר לו model state ככה, אז בעצם זאת לולאה חוקית שרצה collection, כי על כל collection אפשר לרוץ בלולאת for each. מה זה item?

  9. 02:23

    item יש key ו-value. אנחנו צריכים להבין מה זה בעצם ה-key ומה זה ה-value. אז ה-key זה סך הכול string. בואו נסתכל item נקודה key אומר לי שזה string וה-value זה איזשהו אובייקט שנקרא model state entry.

  10. 02:39

    זה בעצם פריט שנמצא בתוך ה-dictionary הזה ומתאר property במודל שנכשל. אם יש לי property ששולחים והוא לא נכשל בוולידציה, אז הוא בכלל בכלל לא יהיה בתוך ה-dictionary הזה.

  11. 02:57

    זאת אומרת שה-dictionary הזה כולל רק פריטים שנכשלו. בואו ננסה רגע לעשות כזה דבר. נריץ את item נקודה key, כי זה string, מאוד קל לראות stringים על הקונסול.

  12. 03:09

    כאן פשוט נשלח לפונקציה get all errors, נשלח לה את ה-model state שלנו בצורה כזאת ואז היא תציג לנו על המסך רק את המאפיינים שנכשלו. בואו ננסה.

  13. 03:23

    ניגש-- קודם כל נריץ כמובן וניגש ל-postman

לקורס המלא: קורס דוט-נט - NET Core. - עם Rest API

ההרצאה הקודמת: שימוש ב-ModelState

ההרצאה הבאה: יצירת מאפיין וולידציה - Custom Validator

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

  • הודעות שגיאה בריאקט
  • התאמה אישית של הודעות שגיאה
  • הוצאת סיסמאות מתוך דיסק - SAM - Mimikatz

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

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