繁体   English   中英

Content-Type标头是否适用于除PUT或POST之外的任何HTTP谓词?

[英]Is the Content-Type header appropriate for any HTTP verb other than PUT or POST?

我正在尝试使用CollectionSpace软件的REST API,并注意到将其作为GET请求的一部分发送给Content-Type标头会导致以下错误:

HTTP Status 415 - Cannot consume content type

我试过的两个python REST客户端库,在谷歌代码上的github和python-rest-client上的restclient,在发出GET请求时都会发送一个Content-Type头。

我在审核http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html时的理解是,客户端应该只在POST和PUT请求上发送Content-Type标头。 那是对的吗?

这两个库都发送了标头的事实使我认为服务器通常会忽略它,而不是返回客户端错误代码。

虽然没有在规范中明确概述,但可以做出一些推论。 第7.2.1节说明

包含实体主体的任何HTTP / 1.1消息应该包括定义该主体的媒体类型的Content-Type头部字段。

这很明显,而且很有意义。 鉴于此,我们可以查看第9节 (方法定义),看看哪些提到他们可能在请求体中有一个实体。 其中三个提到它:

OPTIONS

如果OPTIONS请求包含实体主体(由Content-Length或Transfer-Encoding的存在指示)......

POST

...用于请求原始服务器接受请求中包含的实体...

...请求将所包含的实体存储在提供的Request-URI下

并且一种方法特别禁止实体, TRACE

TRACE请求不得包含实体。

实际上,您可以使用正文中的实体和Content-Type标头发送任何方法(TRACE除外)。 但是,根据规范,我不希望服务器对它做任何事情,除非它是上面三种方法之一。


我还要说,您正在使用的响应HTTP状态415的软件违反了规范。

第4.3节说:

...如果请求方法不包含实体主体的定义语义,则在处理请求时应该忽略消息主体。

由于规范不包含具有GET请求的实体主体的已定义语义,因此服务器应忽略它。

另外,如果请求中没有提供实体,并且Content-Length为零(假设Transfer-Encoding标头未设置且不是“identity”),则服务器不应尝试使用实体,无论请求如何方法或是否存在Content-Type标头。 这可以通过确定第4.4节中描述的消息长度的优先顺序来备份。

415无法使用内容类型

如果REST资源有@Consumes建议接受特定的MIME类型,则会出现此问题。 要修复此设置,请在Request / Resource调用中设置正确的“Accept”标头以及“Content-Type”标头。 对于来自RESTEasy的MockHttpRequest,它可以简单地完成

request.accept(MediaType.APPLICATION_JSON); request.contentType(MediaType.APPLICATION_JSON);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM