标头参数:REST上下文中的"接受"和"内容类型"

Emi*_*and 24 rest http-headers

我知道该Accept参数定义了从服务器发送的客户端响应中所期望的数据类型,因此它被用作响应头.

我的问题是有关Content-type,它的使用由客户来定义发送的请求的主体格式,我一直把它作为一个客户端请求的一部分,所以我必须在我与设置的标头的客户端请求AcceptContent-type.最近,我遇到了一个项目,其中Content-type在响应标头中定义(因此由服务器发送).所以我的问题是:Content-type需要设置为客户端请求标头的一部分或作为服务器响应标头的一部分,还是可以设置为两者?

Cod*_*ter 36

阅读相关的RFC.在这种情况下7231:

5.3.2.接受

用户代理可以使用"Accept"标头字段来指定 可接受的响应媒体类型.


3.1.1.5.内容类型

"Content-Type"标题字段指示关联表示的媒体类型

所以:Accept表示客户端可以接受的服务器响应类型.Content-type始终是关于当前请求或响应的内容.

因此,如果您的请求没有有效负载,则不使用内容类型请求标头.

  • @Timo 为什么服务器要猜测?客户端知道它发送的内容,因此应该对其进行广告。猜测会导致错误。有多种格式看起来像 JSON,但具有不同的语义。 (2认同)

Mur*_*HAN 12

MDN 对此给出了明确的解释:

接受

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

内容类型

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

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

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


小智 9

HTTP客户端使用Accept标头告诉服务器他们期望/喜欢哪种类型的内容作为响应.客户端和服务器既可以使用内容类型来标识其请求(客户端)或响应(服务器)中的数据格式,也可以帮助其他部分正确解释信息.


Joh*_*nny 8

TL; 博士

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

详细回答

正如您正确地注意到的,AcceptHTTP 客户端使用标头来告诉服务器哪些响应媒体类型是可接受的。反过来,服务器将发回一个响应,其中将包含Content-Type告诉客户端实际返回的媒体类型的标头。

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


Pre*_*raj 8

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

Accept is Client请求头字段可用于指定响应可接受的某些媒体类型

Content -Type实体头字段指示发送给接收者的实体主体的媒体类型。

HTTP 标头字段提供有关请求或响应或有关消息正文中发送的对象的必需信息。HTTP 消息头有四种类型:

  • 通用标头:这些标头字段对请求和响应消息具有普遍适用性。
  • 客户端请求标头:这些标头字段仅适用于请求消息。
  • 服务器响应标头:这些标头字段仅适用于响应消息。
  • 实体标头:这些标头字段定义有关实体主体的元信息,或者如果不存在主体,则定义有关请求标识的资源的元信息。 来源

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