【问题标题】:How to get a HEAD of a Retrofit call from an api endpoint that requires field in the request body?如何从需要请求正文中的字段的 api 端点获取改造调用的 HEAD?
【发布时间】:2016-08-08 12:23:57
【问题描述】:

我正在尝试在实际下载内容之前检查来自通过 Retrofit 2.0.2 进行的 API 调用的响应的标头。

我的 API 接口如下所示:

@Headers({"Accept: application/json", "Origin: http://www.example.com"})
@HEAD("profiles")
Call<Void> getProfileHeaders(@Field("puids") String puid);

请注意,API 调用要求我在正文中指定一个名为 puids=%{UUID} 的 UUID 列表字段,以便返回响应。

如果我想在不检查标题的情况下下载数据,我会调用这样的接口:

@Headers({"Accept: application/json", "Origin: http://www.example.com"})
@FormUrlEncoded
@POST("profiles")
Call<String> getProfile(@Field("puids") String puid);

现在的问题是,当我尝试使用 getProfileHeader() 端点时,我得到以下 RuntimeException:

java.lang.IllegalArgumentException: @Field parameters can only be used with form encoding. (parameter #1)

为了使用@Field 参数(我想如果需要,POST 方法通常会这样做),我必须明确指定我使用@FormUrlEncoded,但我不能进行@HEAD 调用用那个。

我有点疑惑,我怎么才能实现我想要的,又缺少什么?

基本上我想知道如何在下载需要字段参数的 API 端点的实际正文之前检查改造调用的响应标头?

干杯!

【问题讨论】:

    标签: android http retrofit2


    【解决方案1】:

    好的,我刚刚意识到我的困惑源于几个误解:

    1. @HEAD 是一种 HTTP 方法,通常用于验证超链接的有效性以及服务器对 GET 调用的响应。它不适用于POST 请求,理论上是不正确的。

    取自 HTTP/1.1 定义的RFC2616:

    HEAD 方法与 GET 相同,只是服务器不能 在响应中返回消息体。包含的元信息 在响应 HEAD 请求的 HTTP 标头中应该是相同的 响应 GET 请求而发送的信息。这种方法可以 用于获取有关实体隐含的元信息 请求而不传输实体主体本身。这种方法是 通常用于测试超文本链接的有效性、可访问性、 以及最近的修改。

    对 HEAD 请求的响应可能是可缓存的,因为 响应中包含的信息可用于更新 以前从该资源缓存的实体。如果新的字段值 表示缓存的实体与当前实体不同(如 将通过 Content-Length、Content-MD5、ETag 或 Last-Modified),那么缓存必须将缓存条目视为陈旧的。

    1. 根据定义发出POST 请求时,我们已经计算了服务器端的响应并考虑了下载正文的时间。

    POST 方法的一个函数,如RFC2616 中所定义,是:

    • 向数据处理进程提供数据块,例如提交表单的结果;

    因此,为了不下载正文而验证标头与此目的不符。


    正如上面@Radek 所提到的,对GET 请求使用拦截器来动态修改和/或检查请求可以完成这项工作,但此时我们也可以发起HEAD 方法请求。

    解决这个问题的方法是更好地与RFC2616 中定义的标准定义保持一致,方法是在服务器端进行更改,而不是将原始数据块作为 POST 响应返回,使其返回然后在 GET/HEAD 请求中调用的资源。只需重构服务调用以使用GET 而不是POST。

    【讨论】:

      【解决方案2】:

      改造使用的 Okhttp 具有拦截器,可让您即时修改或检查请求。查看github documentation

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 2015-11-25
        • 1970-01-01
        • 2018-12-14
        • 2018-09-22
        • 2017-07-18
        • 2021-03-07
        • 1970-01-01
        • 2020-06-24
        相关资源
        最近更新 更多