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;
        }