响应Content-Type应该始终与Accept相同吗?

时间:2016-01-28 09:41:01

标签: rest http

我有一个资源,其中包含实体格式的原始版本,以及后来的改进版本,其中包含重大更改。

调用者使用Accept标题选择更高版本。

假装我的服务只返回JSON。

响应应该是application/json还是Accept标题中的格式?有人在乎我是否作弊?

例如,这是好还是坏:

  • 客户请求:GET /people/1; Accept: application/vnd.personv2+json
  • 服务器响应:200 { "Name": "John" }; Content-Type: application/json

服务器使用JSON呈现了一个v2人格式,但是说它只是“正常”的正常应用程序JSON,而不是说它正是所要求的格式。

2 个答案:

答案 0 :(得分:1)

不,accept标记端点可以处理的内容类型。端点可以处理json吗? XML? IMG? HTML?等...更正式地说:

  

Accept request-header字段可用于指定响应可接受的某些媒体类型。 Accept标头可用于指示请求仅限于一小组所需类型,例如请求内嵌图像。

content-type是响应在其有效负载中的含义,以便请求发起者知道如何处理。并且正式:

  

Content-Type entity-header字段指示发送给收件人的实体主体的媒体类型,或者在HEAD方法的情况下,指示请求为GET时发送的媒体类型。< / p>

例如 - 您的Web服务器中有一个端点接受json(例如 - 客户端数据{'name': 'some-name', 'age': '30'})并返回一个图像(例如 - 30岁人群的描述性图像) )。在这种情况下,接受将是application/json,响应类似于img/*

这也适用于您的情况。接受是一回事,内容类型是另一回事。即使它们在语义上也不一定相同。

答案 1 :(得分:1)

RFC 7231非常清楚:

  

如果[accept]标题字段是      出现在请求中,并且没有任何可用的表示形式      响应的媒体类型列为可接受的,      原始服务器可以

     
      
  • 通过发送406(不是   可接受的)回复或
  •   
  • 通过处理来忽略标题字段   回应好像不受内容协商的影响。
  •   

格式化我的。

是的,您提出的要求(&#34;当客户请求application/json时退回application/vnd.personv2+json)&#34; 就可以了。< / p>