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

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

  1. 客户端为他要发送给服务器的正文设置一个内容类型(例如post)
  2. 服务器为响应设置内容类型。

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

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

163095 次浏览

Get请求不应该有内容类型,因为它们没有请求实体(即主体)。

GET请求可以有“Accept”报头,表示客户机可以理解哪些类型的内容。然后服务器可以使用它来决定发送回哪种内容类型。

不过它们是可选的。

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

根据RFC 7231章节3.1.5.5:

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

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

公认的答案是错误的。引用是正确的,PUT和POST必须拥有它的断言是不正确的。没有要求PUT或POST实际上有额外的内容。也没有禁止GET实际拥有内容。

rfc确切地表达了他们的意思。敌我识别你的一方(客户端或源服务器)将发送额外的内容,超出HTTP头,它应该指定一个内容类型头。但是请注意,可以省略content - type而仍然包含内容(例如,通过使用content - length标头)。

在GET消息上不传递内容类型的问题是确定内容类型是不相关的,因为无论如何都由服务器端决定内容。 我遇到的问题是,现在有很多地方把他们的web服务设置得足够智能,可以接收你传递的内容类型,并以你请求的“类型”返回响应。 如。我们目前正在与一个默认为JSON的地方通信,然而,他们已经设置了他们的web服务,这样如果你传递一个内容类型的xml,他们将返回xml而不是他们的JSON默认值。我认为这是一个很好的想法

简单的回答:大多数情况下,你不需要是HTTP GET请求的内容类型报头。但是规范似乎也没有排除HTTP GET的内容类型报头。

支撑材料:

    <李> < p >“Content-Type"是表示(即有效负载)元数据的一部分。引用 RFC 7231章节3.1: < / p >

    3.1. 表示元数据

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

    以下报头字段传递表示元数据:

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

    引用自RFC 7231章节3.1.1.5(顺便说一下,当前选择的答案在节号中有一个错别字):

    < p >“Content-Type"头字段表示对象的媒体类型 相关代表< / p >
  1. 在这种意义上,Content-Type报头并不是真正关于HTTP GET请求(也不是POST或PUT请求)。它是关于这样一个无论请求中的有效负载。因此,如果没有有效负载,则不需要Content-Type。在实践中,一些实现继续进行,并做出了可以理解的假设。引自亚当的评论:

    “虽然……规范没有说你不能在GET上有Content-Type, . net似乎在它的HttpClient中强制了它。看到这个SO q&a !”

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

    4.3.1得到

    ...

    GET请求消息中的有效负载没有定义的语义; 在GET请求上发送有效负载主体可能会导致一些现有的问题

    所以,如果你的HTTP GET因为某种原因碰巧包含了一个有效负载,Content-Type报头可能也是合理的。

我发现这篇文章在阐明“内容类型”概念方面非常有用,你可以查看它,在最后,有一个HTTP内容类型标头的常见值列表。

https://www.geeksforgeeks.org/http-headers-content-type/