הבנת קשירת פרמטרים ב- ASP.Net Web API

ASP.Net Web API היא מסגרת קלה המשמשת לבניית שירותי HTTP RESTful. בעת עבודה עם שיטות בקר ב- API של האינטרנט, לרוב תצטרך להעביר פרמטרים לשיטות אלה. "פרמטר" כאן פשוט מתייחס לוויכוח לשיטה, ואילו "קשירת פרמטר" מתייחס לתהליך של הגדרת ערכים לפרמטרים של שיטות ה- Web API.

שים לב שישנן שתי דרכים בהן Web API יכול לאגד פרמטרים: כריכת מודלים ומעצבים. כריכת מודל משמשת לקריאה ממחרוזת השאילתה, ואילו מעצבים משמשים לקריאה מגוף הבקשה. אתה יכול גם להשתמש בממירי סוג כדי לאפשר ל- API API להתייחס למחלקה כאל סוג פשוט ואז לאגד את הפרמטר מה- URI. לשם כך יהיה עליך ליצור ממיר TypeConverter מותאם אישית. אתה יכול גם ליצור קלסר מודל מותאם אישית על ידי הטמעת ממשק IModelBinder בכיתה שלך ואז יישום שיטת BindModel. למידע נוסף על ממירי סוג וקובעי דגם, עיין בתיעוד זה של מיקרוסופט.

כעת, על מנת לאגד פרמטרים, Web API פועל לפי כלל זה: עבור סוגים פשוטים, Web API מנסה להשיג את הערך מה- URI, ולסוגים מורכבים, Web API מנסה להשיג את הערך מגוף הבקשה. הסוגים הפשוטים כאן מתייחסים הן לסוגים הפרימיטיביים של .Net - int, bool, double, float וכן הלאה - וגם לסוגים אחרים הכוללים TimeSpan, DateTime, Guid, עשרוני ומחרוזת. הוא כולל גם כל סוג שעבורו ניתן להמיר סוג שיכול להמיר ממחרוזת. בחלק הבא נחקור את התכונות [FromBody] ו- [FromUri] המשמשות לקישור ערכים מגוף הבקשה ו- URI בהתאמה.

מתי להשתמש ב- [FromBody] וב- [FromUri] ב- API של האינטרנט

אם אתה משתמש ב- Web API מזה זמן מה, ייתכן שאתה מכיר את התכונות [FromBody] ו- [FromUri]. התכונה [FromUri] מוקדמת לפרמטר כדי לציין שיש לקרוא את הערך מתוך ה- URI של הבקשה, והמאפיין [FromBody] משמש לציון שיש לקרוא את הערך מגוף הבקשה.

עבור כל הסוגים הפרימיטיביים (int, double, float וכו '), זמן הריצה של Web API מנסה לקרוא את הערך מ- URI של בקשת HTTP. עבור סוגים מורכבים (מקרים של שיעורים), זמן הריצה של ה- API של Web מנסה לקרוא את הערך מגוף בקשת ה- HTTP באמצעות מעצב מסוג מדיה. זוהי התנהגות ברירת המחדל של Web API. 

לפיכך, אם יש לך ערך ב- URI של הבקשה שהוא סוג פרימיטיבי, אינך צריך לציין את התכונה [FromUri]. באופן דומה, אם יש לך גוף בגוף הבקשה ערך מורכב, אינך צריך לציין את התכונה [FromBody]. עם זאת, אם הסוג הפרימיטיבי שוכן בגוף הבקשה או הסוג המורכב שוכן ב- URI של הבקשה, עליך לציין את התכונה [FromBody] או [FromUri]. הסיבה היא שאתה חורג מהתנהגות ברירת המחדל בשני המקרים.

כיצד להשתמש ב- [FromBody] וב- [FromUri] ב- Web API

קטע הקוד הבא ממחיש כיצד ניתן לציין את התכונה [FromBody] עבור סוג נתונים בסיסי המועבר כפרמטר לשיטת Web API.

מחלקה ציבורית SecurityController: ApiController

{

    הודעה ציבורית HttpResponseMessage (מזהה int [[FromBody])

    {

       // כתוב כאן את הקוד שלך

    }

}

והנה קטע קוד שממחיש כיצד ניתן להעביר סוג מורכב כפרמטר לשיטת Web API באמצעות התכונה FromUri.

מחלקה ציבורית SecurityController: ApiController

{

    הודעה ציבורית HttpResponseMessage (משתמש משתמש [FromUri])

    {

       // כתוב כאן את הקוד שלך

    }

}

יש לציין כי שליחת נתוני אימות משתמשים כמו שם משתמש וסיסמה דרך ה- URI אינה נוהג טוב, גם אם אתה משתמש ב- SSL. הסיבה לכך היא שניתן לשמור נתונים כאלה ביומני הדפדפן, שם הם חשופים לחשיפה. כאשר מעבירים נתונים רגישים כלשהם (שמות משתמש, סיסמאות, פרטי כרטיס אשראי וכו ') דרך גוף הבקשה, חובה להשתמש ב- [FromBody] בכל מקרה.

שים לב שכאשר אתה משתמש במאפיין [FromBody] בעת העברת פרמטר לשיטת Web API, זמן הריצה של Web API מנצל את הכותרת של סוג התוכן כדי לבחור את המעצב הנכון. אתה יכול ללמוד עוד על משא ומתן על תוכן ב- API API ממאמר שלי כאן.