Header 参数:REST 上下文中的 "Accept" 和 "Content-type"

Header parameters: "Accept" and "Content-type" in a REST context

我了解到 Accept 参数定义了服务器发送的客户端响应中预期的数据类型,因此它被用作响应 header。

我的问题是关于 Content-type,客户端使用它来定义发送请求的 body 格式,我总是将它用作客户端请求的一部分,所以我有一个我在 header 中设置 AcceptContent-type 的客户端请求。最近,我遇到了一个项目,其中 Content-type 在响应 header 中定义(由服务器发送)。所以我的问题是:Content-type 需要设置为客户端请求的一部分 header 或服务器响应的一部分 header 还是可以同时设置为两者?

可以在规格中找到差异,在这种情况下 RFC 7231:

5.3.2. Accept

The "Accept" header field can be used by user agents to specify response media types that are acceptable.


3.1.1.5. Content-Type

The "Content-Type" header field indicates the media type of the associated representation

Accept header 始终表示客户端可以接受来自服务器 的哪种 响应。 Content-type是关于当前请求或响应的内容,取决于它应用的是哪种HTTP报文。

因此,如果请求没有负载,您不必发送 content-type 请求 header,您的响应也是如此:没有 body,没有 header 必须的。

有些服务器可能会要求您在请求中提供 content-type,即使该请求没有负载;如果您省略它,服务器应该 return 一个 415 Unsupported Media Type 响应。

Accept header 由 HTTP 客户端用来告诉服务器他们 expect/prefer 响应的内容类型。 Content-type 客户端和服务器都可以使用它们来识别请求(客户端)或响应(服务器)中的数据格式,从而帮助另一部分正确解释信息。

TL;DR

实体header Content-Type用于表示资源的媒体类型。在响应中,Content-Type header 告诉客户端返回内容的内容类型实际上是什么。在 POST 或 PUT 等请求中,客户端告诉服务器实际发送的数据类型。

详细答案

正如您正确注意到的那样,HTTP 客户端使用 Accept header 来告诉服务器可以接受哪些响应媒体类型。然后,服务器将发回一个响应,其中将包括 Content-Type header 告诉客户端实际返回的媒体类型。

现在,Content-Type header 也可以请求和响应。为什么?好吧,想想 POST 或 PUT 请求。对于这些请求类型,客户端实际上是将一堆数据作为请求的一部分发送到服务器,Content-Type header 告诉服务器实际数据是什么,从而决定服务器将如何处理解析它。

内容协商: 是用于在同一 URI 处提供资源的不同表示形式的机制。

Accept is Client Request-header 字段可用于指定响应可接受的某些媒体类型。

Content-Typeentity-header字段表示entity-body发送的媒体类型给收件人。

HTTP header 字段提供有关请求或响应的必需信息,或有关消息 body 中发送的 object 的必要信息。有四种类型的 HTTP 消息 headers:

  • General-header: 这些 header 字段一般适用于 请求和响应消息。
  • 客户Request-header:这些header字段只有适用性 用于请求消息。
  • 服务器Response-header:这些header字段只有适用性 用于响应消息。
  • Entity-header: 这些 header 字段定义关于 entity-body 或者,如果不存在 body,则关于已识别的资源 应要求。 Source

https://www.w3.org/Protocols/HTTP/HTRQ_Headers.html
https://www.w3.org/Protocols/HTTP/Object_Headers.html

我觉得这个在MSDN上解释的很清楚了。

Accept

接受请求 HTTP header 通告哪些内容类型,以 MIME 类型表示,客户端能够理解。使用内容协商,服务器然后选择其中一个提议,使用它并通过 Content-Type 响应 header 通知客户端其选择。浏览器根据请求完成的上下文为此 header 设置足够的值:当获取 CSS 样式表时,为请求设置的值与获取图像、视频或脚本时不同。

Content-Type

Content-Type 表示 header 用于指示资源的原始媒体类型(在为发送应用任何内容编码之前)。

在响应中,Content-Type header 告诉客户端返回内容的内容类型实际上是什么。浏览器在某些情况下会进行 MIME 嗅探,不一定会遵循此 header 的值;为了防止这种行为,可以将 header X-Content-Type-Options 设置为 nosniff.

在请求中,(例如 POST 或 PUT),客户端告诉服务器实际发送的数据类型。