什麼是 Asp.Net webAPI C# 中的內容協商?


內容協商是在有多種表示形式可用時,選擇給定響應的最佳表示形式的過程。也就是說,根據請求中的 Accept 標頭值,伺服器傳送響應。HTTP 中內容協商的主要機制是以下請求標頭:

Accept − 響應可接受的媒體型別,例如“application/json”、“application/xml”或自定義媒體型別,例如“application/vnd.example+xml”

Accept-Charset − 可接受的字元集,例如 UTF-8 或 ISO 8859-1。

Accept-Encoding − 可接受的內容編碼,例如 gzip。

Accept-Language − 首選自然語言,例如“en-us”。

伺服器還可以檢視 HTTP 請求的其他部分。例如,如果請求包含 X-Requested-With 標頭(指示 AJAX 請求),則伺服器可能會在沒有 Accept 標頭的情況下預設為 JSON。

在內容協商中,管道從 HttpConfiguration 物件獲取 IContentNegotiator 服務。它還從 HttpConfiguration.Formatters 集合獲取媒體格式化程式列表。

接下來,管道呼叫 IContentNegotiator.Negotiate,傳入:

  • 要序列化的物件型別
  • 媒體格式化程式的集合
  • HTTP 請求

Negotiate 方法返回兩條資訊:

  • 使用哪個格式化程式
  • 響應的媒體型別

如果找不到格式化程式,則 Negotiate 方法返回 null,客戶端會收到 HTTP 錯誤 406(不可接受)。

讓我們考慮如下所示的 StudentController。

using DemoWebApplication.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
   public class StudentController : ApiController{
      List<Student> students = new List<Student>{
         new Student{
            Id = 1,
            Name = "Mark"
         },
         new Student{
            Id = 2,
            Name = "John"
         }
      };
   }
}

RESTful 服務的標準之一是,客戶端應該能夠決定他們希望以哪種格式獲取響應 - XML、JSON 等。傳送到伺服器的請求包含一個 Accept 標頭。客戶端可以使用 Accept 標頭指定響應的格式。例如

Accept: application/xml returns XML
Accept: application/json returns JSON

以下輸出顯示當我們將 Accept 標頭作為 application/XML 傳遞時,響應為 XML。

以下輸出顯示當我們將 Accept 標頭作為 application/JSON 傳遞時,響應為 JSON。

當響應以請求的格式傳送到客戶端時,請注意,響應的 Content-Type 標頭設定為相應的值。例如,如果客戶端請求 application/xml,則伺服器以 XML 格式傳送資料,並將 Content-Type 設定為 application/xml。

我們還可以指定質量因子。在下面的示例中,xml 的質量因子高於 json,因此伺服器使用 XML 格式化程式並將資料格式化為 XML。application/xml;q=0.8,application/json;q=0.5

更新於: 2020-09-24

2K+ 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.