כיצד לעבוד עם משא ומתן על תוכן ב- Web API

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

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

מהו תוכן במשא ומתן ומדוע הוא חשוב?

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

ב- Web API, משא ומתן על תוכן מתבצע על ידי זמן הריצה (בצד השרת) כדי לקבוע את מעצב סוג המדיה שישמש לשימוש בהתבסס להחזרת התגובה לבקשה נכנסת מצד הלקוח.

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

מסגרת ה- API של האינטרנט מגיעה עם המעצבים הבאים כברירת מחדל.

  • System.Net.Http.Formatting.JsonMediaTypeFormatter
  • System.Net.Http.Formatting.XmlMediaTypeFormatter
  • System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
  • System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter

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

  • QueryStringMapping
  • UriPathExtensionMapping
  • RequestHeaderMapping
  • מיפוי מדיה

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

public class MediaTypeMapping : MediaTypeMapping

{

   protected override double OnTryMatchMediaType(HttpResponseMessage response)

     {

                //Write your custom code here

     }

}

קטע הקוד הבא ממחיש כיצד ניתן לאחזר את שמות כל המעצבים הנתמכים ב- Web API על ידי איטרציה של אוסף HttpConfiguration.Formatters.

   [HttpGet]

       public List GetAllFormatters()

       {

           List lstFormaters = new List();

           foreach (var formatter in this.Configuration.Formatters)

           {

               lstFormaters.Add(formatter.GetType().Name);

           }

           return lstFormaters;

       }

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

public class CustomerDTO

   {

       public Int32 Id

       { get; set; }

       public string FirstName

       { get; set; }

       public string LastName

       { get; set; }

       public string Address

      { get; set; }

   }

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

private List GetCustomerData()

       {

           List lstCustomers = new List();

           CustomerDTO customer = new CustomerDTO();

           customer.Id = 1;

           customer.FirstName = "Joydip";

           customer.LastName = "Kanjilal";

           customer.Address = "Hyderabad, India";

           lstCustomers.Add(customer);

           return lstCustomers;

       }

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

[HttpGet]

       public HttpResponseMessage GetCustomers()

       {

           List lstCustomers = GetCustomerData();

           IContentNegotiator negotiator = Configuration.Services.GetContentNegotiator();

           ContentNegotiationResult result = negotiator.Negotiate(typeof(CustomerDTO), Request, Configuration.Formatters);

           return new HttpResponseMessage()

           {

               Content = new ObjectContent (lstCustomers, result.Formatter, result.MediaType.MediaType)

         };

       }

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

[HttpGet]

       public HttpResponseMessage GetCustomers()

       {

           List lstCustomers = GetCustomerData();

           return new HttpResponseMessage()

           {

               Content = new ObjectContent (lstCustomers, Configuration.Formatters[1])

           };

      }

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

public class CustomMediaTypeFormatter : MediaTypeFormatter

   {

       public override bool CanReadType(Type type)

       {

           throw new NotImplementedException();

       }

       public override bool CanWriteType(Type type)

       {

           throw new NotImplementedException();

       }

   }

לאחר שהמעצב המותאם אישית שלך נמצא במקום, תוכל להוסיף אותו לאוסף המעצבים בקלות:

config.Formatters.Add(new CustomMediaTypeFormatter ());