ASP.NET Web API 内容协商基本信息

内容协商可以定义为为给定资源选择最佳表示的过程。因此,内容协商意味着客户端和服务器可以在它们之间进行协商,以便客户端可以根据其所需的格式获取数据。

互联网依赖三点,

  • 资源
  • 资源指针(URL)
  • 资源的表示

第三点比其他两点更重要,因为一切都是基于我们如何看待资源而工作的。我们可以用两种格式表示资源。

  1. XML(可扩展标记语言)格式
  2. JSON(JavaScript 对象表示法)格式

RESTful 服务的标准之一是,客户端应该能够以 JSON 或 XML 来决定他们想要响应的格式。发送到服务器的请求包括 Accept 标头。使用 Accept 标头,客户端可以指定响应的格式。

例如,

Accept: application/xml 以 XML 格式返回结果

Accept: application/json 以 JSON 格式返回结果

根据请求中的 Accept 标头值,服务器发送响应。这称为内容协商。

当我们以特定格式请求数据时,幕后会发生什么?

ASP.NET Web API 控制器生成我们要发送到客户端的数据,并将数据交给 Web API 管道,然后查找客户端的 Accept 标头。然后,选择适当的格式化程序来格式化数据。

由于 ASP.NET Web API 具有很强的可扩展性,因此我们还可以在请求标头中为 accept 头指定多个值。

Accept: application/xml,application/json

在上述情况下,服务器选择第一个格式化程序来格式化响应数据。

我们还可以在 accept 标头中指定品质因数。在这种情况下,服务器选择具有更高品质因数的格式。

Accept: application/json;q=0.8,application/xml;q=0.5

如果我们没有指定任何 Accept 标头,那么默认情况下服务器选择 JSON 格式化程序。

当响应以请求的格式发送到客户端时,请注意响应的 Content-Type 标头设置为适当的值。例如,如果客户端已请求 application/xml,则服务器以 XML 格式发送数据并设置 Content-Type=application/xml

服务器将格式化程序用于请求和响应消息。当客户端向服务器发送请求时,我们将 Content-Type 标头设置为适当的值,以使服务器知道我们正在发送的数据的格式。

例如,如果客户端正在发送 JSON 数据,则 Content-Type 标头将设置为 application/json。服务器知道它正在处理 JSON 数据,因此它使用 JSON 格式化程序将 JSON 数据转换为 .NET 类型。类似地,当从服务器向客户端发送响应时,根据 Accept 标头值,使用适当的格式化程序将 .NET 类型转换为 JSON,XML 等。

不同类型的响应格式示例:

应用程序/ JSON:

{
  "Email": "sample string 1",
  "HasRegistered": true,
  "LoginProvider": "sample string 3"
}

应用程序/ XML:

<UserInfoViewModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WebApiDemo.Models">
  <Email>sample string 1</Email>
  <HasRegistered>true</HasRegistered>
  <LoginProvider>sample string 3</LoginProvider>
</UserInfoViewModel>

现代基于 Web 的应用程序可以提供各种语言和格式的数据。因此,如果我们开发 API 以覆盖全球用户,那么内容协商就是相关的。