Header 参数:REST 上下文中的 "Accept" 和 "Content-type"
Header parameters: "Accept" and "Content-type" in a REST context
我了解到 Accept
参数定义了服务器发送的客户端响应中预期的数据类型,因此它被用作响应 header。
我的问题是关于 Content-type
,客户端使用它来定义发送请求的 body 格式,我总是将它用作客户端请求的一部分,所以我有一个我在 header 中设置 Accept
和 Content-type
的客户端请求。最近,我遇到了一个项目,其中 Content-type
在响应 header 中定义(由服务器发送)。所以我的问题是:Content-type
需要设置为客户端请求的一部分 header 或服务器响应的一部分 header 还是可以同时设置为两者?
可以在规格中找到差异,在这种情况下 RFC 7231:
The "Accept" header field can be used by user agents to specify
response media types that are acceptable.
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-Type是entity-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),客户端告诉服务器实际发送的数据类型。
我了解到 Accept
参数定义了服务器发送的客户端响应中预期的数据类型,因此它被用作响应 header。
我的问题是关于 Content-type
,客户端使用它来定义发送请求的 body 格式,我总是将它用作客户端请求的一部分,所以我有一个我在 header 中设置 Accept
和 Content-type
的客户端请求。最近,我遇到了一个项目,其中 Content-type
在响应 header 中定义(由服务器发送)。所以我的问题是:Content-type
需要设置为客户端请求的一部分 header 或服务器响应的一部分 header 还是可以同时设置为两者?
可以在规格中找到差异,在这种情况下 RFC 7231:
The "Accept" header field can be used by user agents to specify response media types that are acceptable.
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-Type是entity-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),客户端告诉服务器实际发送的数据类型。