【问题标题】:Proper behavior for clients receiving status 307接收状态 307 的客户端的正确行为
【发布时间】:2015-06-24 09:57:56
【问题描述】:

我一直在使用 OkHttp 来访问 Nest 的 Firebase API(我不喜欢 Firebase SDK,因为它使套接字保持打开状态,这对我来说很耗电)。在几个请求中,我会得到一个状态码 307 来重定向到另一个 URL。这并不奇怪。 令人惊讶的是,即使我调用 client.setFollowRedirects(true) 和/或 client.setFollowSSLRedirects(true),OkHttp 也不遵循重定向,这两者都默认为 true

我在下面复制了我的doPut() 方法版本。如果递归调用不存在,通常尝试将无济于事。我想知道 Firebase 是否使用了错误的状态代码,OkHttp 没有正确解释它,或者这是否是处理这种情况的正确方法。这里似乎有问题,但我不确定是什么。

public static String doPut(String url, String body, String contentType) throws IOException {
  OkHttpClient client = new OkHttpClient();
  RequestBody requestBody =
      RequestBody.create(MediaType.parse(contentType), body);
  Request request = new Request.Builder().url(url).put(requestBody).build();
  Response response = client.newCall(request).execute();
  if (response.code() == 307) {
    doPut(response.header("Location"), body, contentType);
  }
  return response.body().string();
}

【问题讨论】:

  • w3 声明“如果收到 307 状态代码以响应 GET 或 HEAD 以外的请求,则用户代理不得自动重定向请求,除非用户可以确认,因为这可能会改变发出请求的条件。”鉴于我倾向于使用错误状态代码的 Firebase,在这种情况下他们应该使用什么?其他重定向说同样的话。
  • RFC 7231 不包括该子句 (tools.ietf.org/html/rfc7231#section-6.4.7)。正确的行为是PUT 到新位置。

标签: android http firebase okhttp


【解决方案1】:

OkHttp 中没有任何东西可以在保留 POST 方法的同时处理重定向。这可能是我们设计中的一个错误。在此期间,您可以通过在拦截器中处理重定向来解决问题。您可以使用已经编写的代码作为起点; interceptors doc 也可能有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 2014-08-27
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多