2015-06-24 4 views
1

Я использую OkHttp для доступа к API Firebase от Nest (мне не нравится SDK Firebase, так как он держит сокет открытым, который является голодным для моих целей). По нескольким запросам я получу код состояния 307 для перенаправления на другой URL. Это не удивительно. Что is удивительно, что OkHttp не следует перенаправлению, даже если я вызываю client.setFollowRedirects(true) и/или client.setFollowSSLRedirects(true), оба из которых по умолчанию равны true.Правильное поведение для клиентов, получающих статус 307

Я скопировал мою версию метода 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(); 
} 
+0

w3 заявляет, что «если код статуса 307 принимается в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, поскольку это может изменить условия, указанные в который был выдан ». Учитывая, что я склоняюсь к Firebase, используя неправильный код состояния, и в этом случае, что они должны использовать? Другие переадресации говорят то же самое. – keyboardr

+1

RFC 7231 не включает это предложение (https://tools.ietf.org/html/rfc7231#section-6.4.7). Правильное поведение - «PUT» в новом месте. – Joe

ответ

3

В OkHttp нет ничего, что бы обрабатывало перенаправление при сохранении метода POST. Это может быть ошибкой в ​​нашем дизайне. Тем временем вы можете обойтись, обратившись к переадресации в перехватчике. Вы можете использовать код, который вы уже написали, в качестве отправной точки; interceptors doc также может помочь.

Смежные вопросы