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