【发布时间】: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