我需要HTTP GET请求的内容类型标头吗?


154

据我了解,可以在两个地方设置内容类型:

  1. 客户端为他要发送到服务器的正文设置内容类型(例如,用于发布)
  2. 服务器设置响应的内容类型。

这是否意味着我不必为所有get请求(客户端)设置内容类型。如果可以,那应该是什么内容类型?

我还读了几篇文章,指出客户端的内容类型指定了客户端希望接收的内容类型。所以也许我的观点1不正确?

Answers:


112

根据RFC 7231第3.1.5.5节

产生包含有效载荷主体的消息的发送者应该在该消息中生成Content-Type头字段,除非发送者不知道所表示的预期媒体类型。如果 Content-Type头字段不存在,则接收者可以假定媒体类型为“ application / octet-stream”([RFC2046],第4.5.1节),或者检查数据以确定其类型。

这意味着Content-Type仅应为PUTPOST请求设置HTTP标头。


5
@Epoc,引用的消息充其量是隐式的。它实际上并没有说,如果没有实体主体的信息SHOULD NOT包括内容类型。我们有明确的报价吗?
Pacerier,2014年

1
@Pacerier请不要删除别人回答的核心结论,即使它是错误的。我同意Epoc的答案是错误的-在他引用的部分中,没有任何内容可以支持他的答案的结论,应该予以否决。但这并不意味着您应该编辑答案以消除其核心前提,从而完全改变其含义。
Mark Amery

8
我想你们真的在读@Epoc的话。当然,引用的部分并不表示他的意思。但我认为,就执行问题而言,结论是正确的。OP正在寻找关于何时包括Content-Type以及何时不包括Content-Type的明确性。Epoc提供了有关如何使用标头的信息,并得出任何合理的开发人员都会得出的结论:对于具有有效载荷主体(主要是PUT和POST)的请求,您“应该”使用内容类型,而您可能“不应”使用它在没有用的地方,例如GET或HEAD等
。– JVMATL

1
您的帖子中说:“意思是……”。-是舒展的
Adrian Bartholomew



27

接受的答案是错误的。引用是正确的,关于PUT和POST必须具有它的断言是不正确的。不需要PUT或POST实际上具有其他内容。也没有禁止GET实际包含内容的禁令。

RFC中说,正是他们的意思.. IFF你身边(客户端或原始服务器)将派遣更多的内容,超出了HTTP头,它应该指定一个Content-Type头。但是请注意,可以省略Content-Type并且仍然包含内容(例如,使用Content-Length标头)。


0

简短的答案:很可能,不,您不需要 HTTP GET请求的内容类型标头。但是规范似乎也不排除HTTP GET的内容类型标头。

配套材料:

  1. “内容类型”是表示(即有效载荷)元数据的一部分。引自 RFC 7231第3.1节

    3.1。表示元数据

    表示形式报头字段提供有关表示形式的元数据。当消息包含有效载荷主体时,表示形式报头字段描述如何解释有效载荷主体中包含的表示形式数据。...

    以下标头字段传达制图表达元数据:

    +-------------------+-----------------+
    | Header Field Name | Defined in...   |
    +-------------------+-----------------+
    | Content-Type      | Section 3.1.1.5 |
    | ...               | ...             |
    

    引用RFC 7231第3.1.1.5节(顺便说一句,当前选择的答案的节号有错字):

    “ Content-Type”标头字段指示关联表示形式的媒体类型

  2. 从这种意义上说,Content-Type标头实际上与HTTP GET请求(或POST或PUT请求)无关。它是这样一个内部的有效载荷的任何要求。因此,如果没有有效载荷,则不需要Content-Type。在实践中,进行了一些实现并做出了可以理解的假设。引用亚当的评论

    “虽然...规范没有说您不能在GET上使用Content-Type,但.Net似乎在它的HttpClient中强制执行它。请参阅此问与答。”

  3. 但是,严格来说,规范本身并不排除HTTP GET包含有效负载的可能性。引自RFC 7231第4.3.1节

    4.3.1获取

    ...

    GET请求消息中的有效负载没有定义的语义。在GET请求上发送有效内容正文可能会导致某些现有实现拒绝该请求。

    因此,如果您的HTTP GET出于某种原因恰好包含有效负载,则Content-Type标头可能也是合理的。


-2

没有在GET消息上传递内容类型的问题在于,确保内容类型无关紧要,因为服务器端还是要确定内容。我遇到的问题是,现在有很多地方将其Web服务设置为足够聪明,可以接收您传递的内容类型并以您请求的“类型”返回响应。例如。我们当前正在使用默认为JSON的位置进行消息传递,但是,他们已经设置了Web服务,因此,如果您传递xml的内容类型,则它们将返回xml而不是其JSON默认值。我认为前进是一个好主意

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.