【问题标题】:Header parameters: "Accept" and "Content-type" in a REST context标头参数:REST 上下文中的“Accept”和“Content-type”
【发布时间】:2016-06-13 20:26:36
【问题描述】:

我了解Accept 参数定义了从服务器发送的客户端响应中预期的数据类型,因此将其用作响应标头。

我的问题是关于Content-type,它被客户端用来定义所发送请求的正文格式,我总是将它用作客户端请求的一部分,所以我有一个客户端请求,我在其中设置标头AcceptContent-type。最近,我遇到了一个项目,其中Content-type 在响应标头中定义(由服务器发送)。所以我的问题是:Content-type 需要设置为客户端请求标头的一部分或服务器响应标头的一部分,还是可以同时设置为两者?

【问题讨论】:

    标签: rest http-headers


    【解决方案1】:

    阅读相关的 RFC。在这种情况下7231

    5.3.2. Accept

    用户代理可以使用“Accept”标头字段来指定 响应可接受的媒体类型。


    3.1.1.5. Content-Type

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

    所以:Accept 表示客户端可以接受什么样的来自服务器的响应Content-type 总是关于当前请求或响应的内容。

    因此,如果您的请求没有负载,则不必使用内容类型的请求标头。

    即使请求没有负载,服务器也可能要求您在请求中提供内容类型;如果您省略它,服务器将返回 415 Unsupported Media Type 响应。

    【讨论】:

      【解决方案2】:

      我觉得这在 MSDN 里解释的很清楚了。

      Accept

      Accept 请求 HTTP 标头通告客户端能够理解的内容类型,以 MIME 类型表示。使用内容协商,服务器然后选择其中一个建议,使用它并通过 Content-Type 响应标头通知客户端其选择。浏览器根据完成请求的上下文为此标头设置足够的值:获取 CSS 样式表时,为请求设置的值与获取图像、视频或脚本时不同。

      Content-Type

      Content-Type 表示头用于指示资源的原始媒体类型(在申请发送的任何内容编码之前)。

      在响应中,Content-Type 标头告诉客户端返回的内容的实际内容类型是什么。浏览器在某些情况下会进行 MIME 嗅探,不一定会遵循此标头的值;为了防止这种行为,可以将标头 X-Content-Type-Options 设置为 nosniff。

      在请求中(例如 POST 或 PUT),客户端告诉服务器实际发送的是什么类型的数据。

      【讨论】:

        【解决方案3】:

        内容协商: 是用于在同一 URI 处为资源的不同表示提供服务的机制。

        Accept is Client Request-header 字段可用于指定响应可接受的某些媒体类型。

        Content-Typeentity-header字段,表示发送给接收者的entity-body的媒体类型。

        HTTP 标头字段提供有关请求或响应或消息正文中发送的对象的必要信息。 HTTP 消息头有四种类型:

        • General-header:这些头域一般适用于 请求和响应消息。
        • 客户端 Request-header: 这些标头字段仅适用 用于请求消息。
        • 服务器 Response-header: 这些标头字段仅适用 用于响应消息。
        • Entity-header: 这些头域定义了关于 entity-body 或者,如果没有 body,则关于所识别的资源 应要求。 Source

        https://www.w3.org/Protocols/HTTP/HTRQ_Headers.html
        https://www.w3.org/Protocols/HTTP/Object_Headers.html

        【讨论】:

          【解决方案4】:

          TL;DR

          实体头Content-Type用于指示资源的媒体类型。在响应中,Content-Type 标头告诉客户端返回内容的实际内容类型是什么。在 POST 或 PUT 等请求中,客户端会告诉服务器实际发送的数据类型。

          详细解答

          正如您正确注意到的,HTTP 客户端使用 Accept 标头来告诉服务器可接受的响应媒体类型。然后,服务器将轮流发回一个响应,其中将包含 Content-Type 标头,告诉客户端实际返回的媒体类型。

          现在,Content-Type 标头也可以在请求和响应中。为什么?好吧,考虑一下 POST 或 PUT 请求。对于这些请求类型,客户端实际上是在将一堆数据作为请求的一部分发送到服务器,Content-Type 标头告诉服务器数据实际是什么,从而确定服务器将如何解析它。

          【讨论】:

            【解决方案5】:

            HTTP 客户端使用 Accept 标头告诉服务器他们期望/喜欢哪种类型的内容作为响应。客户端和服务器都可以使用 content-type 来识别其请求(客户端)或响应(服务器)中的数据格式,从而帮助对方正确解释信息。

            【讨论】:

            • 我可以在soapui.org/testing-dojo/best-practices/… 中读到内容类型仅用于请求,使用方法 POST 或 PUT,所以不在响应中。他们错了吗?
            • 我不会说他们错了,只是他们没有谈论回应(老实说我还没有阅读完整的文章)。 SoapUI 充当 HTTP 客户端,文本是从该角度编写的。但是,如果他们清楚地说,Content-type 标头仅适用于请求,那么是的,他们错了 :)
            猜你喜欢
            • 2016-02-25
            • 2014-01-24
            • 2012-07-08
            • 1970-01-01
            • 2013-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多