我是否需要http get请求的内容类型?

Mar*_*cka 137 content-type get http

据我所知,有两个地方可以设置内容类型:

  1. 客户端为他发送给服务器的主体设置内容类型(例如发布)
  2. 服务器为响应设置内容类型.

这是否意味着我不必或不应该为我的所有获取请求(客户端)设置内容类型.如果我可以或应该采用什么内容类型?

另外,我在一些帖子中读到,客户端的内容类型指定了客户端希望接收的内容类型.也许我的观点1不对?

Epo*_*poc 97

根据RFC 7231第3.1.5.5节:

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

这意味着Content-Type只应为for PUTPOSTrequest 设置HTTP标头.

  • 它实际上并不意味着.确切地说,它表示Content-Type标题应该(但不一定)用于具有正文的请求,如果在这些情况下它们丢失,那么收件人可能会尝试猜测,或者回退到应用程序/ octet-stream如果不能.即使没有正文,也很容易包含Content-Type.在说"必须只为那些"设置时,"必须"和"唯一"都是错误的. (53认同)
  • 我想你们正在读字体的@ Epoc的话.当然,引用的部分并不意味着他所说的意思.但我认为结论在OPs问题的背景下是正确的.OP正在寻找关于何时包含Content-Type以及何时不包含Content-Type的清晰度.Epoc提供了有关如何使用标头的信息,并得出任何合理的开发人员的结论:您"应该"使用内容类型来处理具有有效负载主体(主要是PUT和POST)的请求,并且您可能"不应该"使用它在无用的地方,如GET或HEAD等. (8认同)
  • @Epoc,引用的消息充其量是隐含的.**实际上并没有说**没有实体主体`不应该'的消息包含内容类型.我们有明确的引用吗? (3认同)
  • @Pacerier,请不要删除别人答案的核心结论,即使它是错误的。我同意 Epoc 的答案是错误的 - 他引用的部分中没有任何内容支持他的答案的结论,并且应该被否决。但这并不意味着您应该编辑答案以消除其核心前提,从而完全改变其含义。 (3认同)
  • 你的帖子声明,“这意味着......” - 是一个延伸。 (2认同)
  • @Pacerier 它实际上并不需要,但是它确实说“‘GET’请求消息中的有效负载没有定义的语义;在 GET 请求上发送有效负载正文可能会导致某些现有实现拒绝该请求。” -- 我仍然将其解释为“不应该”(最佳实践),而不是明确的“一定不”,这只是表明您不应该期望跨服务器实现的一致性。但是,是的,如果您确实包含有效负载,那么您“应该”还包含“Content-Type”;它只是“GET”中的有效负载,不是标准的一部分。 (2认同)

Dmi*_*oda 64

获取请求不应该具有内容类型,因为它们没有请求实体(即正文)

  • @Dmitry,**引用需要**,否则它是一个假设,而不是一个事实. (27认同)
  • 虽然我同意规范并没有说你不能在GET上有Content-Type,但.Net似乎在它的HttpClient中强制执行它.请参阅/sf/ask/747545011/ (2认同)

Mat*_*son 35

GET请求可以有"Accept"标头,表示客户端理解的内容类型.然后,服务器可以使用它来决定要发回的内容类型.

但它们是可选的.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1


小智 24

接受的答案是错误的.引用是正确的,PUT和POST必须拥有它的断言是不正确的.不要求PUT或POST实际上有其他内容.也没有禁止GET实际拥有内容.

RFC确切地说明了它们的意思.. IFF你的身边(客户端或原始服务器)将发送额外的内容,除HTTP标头之外,它应该指定Content-Type标头.但请注意,允许省略Content-Type并且仍然包含内容(例如,通过使用Content-Length标头).


Ray*_*Luo 12

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

支持材料:

  1. “Content-Type”是表示(即有效负载)元数据的一部分。引自 RFC 7231 第 3.1 节

    3.1. 表示元数据

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

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

    +-------------------+-----------------+
    | Header Field Name | Defined in...   |
    +-------------------+-----------------+
    | Content-Type      | Section 3.1.1.5 |
    | ...               | ...             |
    
    Run Code Online (Sandbox Code Playgroud)

    引自RFC 7231 第 3.1.1.5 节(顺便说一下,当前选择的答案在节号中有一个拼写错误):

    “Content-Type”头字段指示相关表示的媒体类型

  2. 从这个意义上说,Content-Type标头实际上并不是关于 HTTP GET 请求(或者 POST 或 PUT 请求)。它与此类任何请求中的有效负载有关。因此,如果没有有效负载,就不需要Content-Type. 在实践中,一些实施继续进行并做出了可以理解的假设。引用Adam 的评论

    “虽然......规范并没有说你不能在 GET 上使用 Content-Type,但 .Net 似乎在它的 HttpClient 中强制执行它。请参阅此 SO q&a。”

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

    4.3.1 获取

    ...

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

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