Web API 中的內容協商

理解這個概念

要了解 Web API 中的內容協商,瞭解術語 Resource 非常重要。

在網路上,我們可以訪問的任何資訊都可以稱為 HTTP resource。在網路上有大量的素材可供檢視,這些素材具有不同的內容型別,例如 html 文件,影象,視訊,音訊,可執行檔案,電子表格等。我們可以通過向資源 uri 發出 http 請求來獲取任何資源。請求的 http 響應,返回資源並指定內容型別,即 also known as media type

為了訪問任何資源,客戶端可以通過提供特定資源 uri 和 http 動詞來發出 http 請求。但是,除此之外,客戶端還可以指定 accept-type,它是使用者正在查詢的內容的格式。 “accept-type”可以在 http 請求頭中定義為accept頭。

然後,伺服器檢查請求中的 accept 標頭,並以指定的格式返回響應(如果可用)。請注意,伺服器只能在請求的表示中返回響應( 如果可用) 。如果請求的表示不可用,則它以預設表示形式返回資源。這就是它被稱為內容協商的原因。

一個實際的例子

例如,假設你向 http://example.com/customer/1 發出請求以獲取 ID 為 1 的客戶的資訊。如果你未在請求中指定 accept 標頭,則 server 將返回此資源的預設表示形式。

假設伺服器可以在 json and xml both 中返回客戶資訊。現在,客戶端在請求的 accept 標題中指定所需的客戶資訊格式。accept標頭的值可以是用於 json 表示的“application/json”,或用於 xml 表示的“text/xml”。然後,伺服器將根據請求的格式返回響應。

如果請求的格式是“text / html”,這個主機不支援(如本例所示),那麼它將是 simply return the resource in the default format 。http 響應包含一個標題“content-type”,它告訴客戶端資源的格式。

請注意,即使在請求的資源表示不可用的情況下,仍會返回資源的預設表示。

這就是為什麼它被稱為內容協商

客戶端協商響應的表示,但是,如果它不可用,則獲取預設響應。

如何在 Web API 中進行配置

在 Web API 中,可以在 WebAPIConfig 類中配置內容協商

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));

你還可以通過實現 IContentNegotiator 介面及其 Negotiate 方法重寫 Web API 中的預設內容協商,然後在 WebAPI.config 檔案中的 Web API 請求管道中進行設定,如下所示:

GlobalConfiguration.Configuration.Services.Replace(typeof(IContentNegotiator), new CustomContentNegotiator());

以下是 Negotiate 方法的示例實現。

public class CustomContentNegotiator : DefaultContentNegotiator
    {
        public override ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
        {
            var result = new ContentNegotiationResult(new JsonMediaTypeFormatter(), new MediaTypeHeaderValue("application/json"));
            return result;
        }