Failure: retrofit.RetrofitError: 307 Временная переадресация?
Я использую библиотеку com.squareup.retrofit:retrofit:1.9.0
, чтобы отправить данные на мой сервер из моего приложения Android.
Фактически, когда я хочу отправить запрос на сервер, я нашел эту ошибку:
failure : retrofit.RetrofitError: 307 Temporary Redirect
Я пробую много идей, но одна и та же проблема сохраняется.
Пожалуйста, помогите мне решить эту проблему.
Привет
Ответы
Ответ 1
Изменить: если вы не должны использовать Retrofit 1.9, переход на более новую версию (то есть 2.0+) должен автоматически обрабатывать решение, описанное ниже.
Похоже, ваш HTTP-клиент (на стороне Android) должен обработать это перенаправление, прочитав значение Location
в заголовке ответа, который вы получаете, когда это произойдет, которое должно содержать целевой URL перенаправления, который вы должны ударить с клиента еще раз.
Смотрите их комментарий здесь.
Итак, теперь вам нужно реализовать это на уровне приложения (который сложно с помощью Retrofit 1, проще с предстоящей модификацией 2) или подождите, пока OkHttp 3.1 (ish), когда мы реализуем новейшую спецификацию.
Смотрите также, что означает 307.
Исправление ошибок 307 - общий ответ 307 с веб-сервера должен всегда включать альтернативный URL, для которого перенаправление должно происходят. Если это так, веб-браузер немедленно повторит попытку альтернативный URL. Таким образом, вы никогда не видите ошибку 307 в Интернете браузера, если, возможно, у вас есть коррумпированная цепочка перенаправления, например. URL Переадресация на URL-адрес B, который, в свою очередь, перенаправляет URL-адрес A. Если ваш клиент не является веб-браузером, он должен вести себя так же, как в Интернете браузер, т.е. немедленно повторите альтернативный URL.
Если веб-сервер не возвращает альтернативный URL-адрес с 307 ответа, то сам программный сервер веб-сервера неисправен или веб-мастер не настроил перенаправление URL правильно.
См. javadoc для Retrofit 1.9.0, чтобы захватить значение заголовка местоположения (URL) из ответа;
http://static.javadoc.io/com.squareup.retrofit/retrofit/1.9.0/retrofit/client/Response.html#getHeaders--
// omitting null check for brevity
for (Header header : response.getHeaders())
{
if (header.getName().equals("Location")) {
redirectURL = header.getValue();
}
}
// do a redirect to redirectURL
Ответ 2
Используется старая зависимость
Измените свою зависимость от
"Com.squareup.retrofit: Модифицированная: 1.9.0"
к
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
также добавить эту зависимость, чтобы получить полный журнал
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'.
Добавьте этот метод в свой клиентский класс Retrofit
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.connectTimeout("Your_Time", TimeUnit.SECONDS);
httpClient.readTimeout("Your_Time", TimeUnit.SECONDS);
httpClient.addInterceptor(logging);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("BASE URL")
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build();
Ниже код должен обрабатывать исключение Http-кода
public Response post(String url, String content) throws IOException {
RequestBody body = RequestBody.create(PROTOCOL, content);
Request.Builder requestBuilder = new Request.Builder().url(url).post(body);
Request request = requestBuilder.build();
Response response = this.client.newCall(request).execute();
if(response.code() == 307) {
String location = response.header("Location");
return post(location, content);
}
return response;
}
Ответ 3
Я получил решение после многих усилий. Может быть, это поможет вам. Если вы получаете эту ошибку "203 HTTP 307 Temporary Redirect" , то этот трюк поможет вам.
В конце добавьте '/' к своей веб-службе, а затем убедитесь, что эта ошибка исчезла. Я не знаю причины этого, но он работает для меня.
Для меня мой старый веб-сервис запроса: https://mydomain/rest/Search.
Используя этот URL-адрес, я получал "203 HTTP 307 Temporary Redirect" , где я смог получить ответ в POSTMAN и веб-браузере.
Мой новый веб-сервис запроса с трюком: https://mydomain/rest/Search/.
Этот '/' устраняет проблему.
Ответ 4
Попробуйте поставить HttpLoggingInterceptor
и проверить журналы. Также перекрестно проверите с Rest Client, если ваш сервер возвращается с правильным ответом или нет для предоставленного ввода вместе с параметрами.
Для HttpLoggingInterceptor
это следующий способ настройки
public RestClient() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(logging);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("BASEURL")
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build();
//APIInterface initiation
service = retrofit.create(APIInterface.class);
}
Ниже приведены зависимости для того же
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
Пройдите через Пример учебника "Модернизация", если вы следуете некоторым другим возможностям запуска остального клиента
Ответ 5
Решение 1
Вы можете создать дополнительный перехватчик для обработки 307
private static class RedirectInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(chain.request());
if (response.code() == 307) {
request = request.newBuilder()
.url(response.header("Location"))
.build();
response = chain.proceed(request);
}
return response;
}
}
и добавьте RedirectInterceptor в ваш okHttpClient (например, okhttp2)
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.interceptors().add(new RedirectInterceptor());
okHttpClient.setFollowRedirects(false);
Решение 2
Вы можете создать ApacheClient с помощью LaxRedirectStrategy
private ApacheClient createRedirectClient(){
return new ApacheClient(HttpClients.custom()
.setRedirectStrategy(new LaxRedirectStrategy()).build());
}
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint("http://yourendpoint")
.setClient(createRedirectClient());
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
Ответ 6
Если вы хотите обработать все 307 ответов, вы можете создать и добавить Interceptor
для выполнения работы; Этот перехватчик просто создает новый запрос с новым путем, который указан в заголовке ответа "location".
val client = OkHttpClient.Builder()
.addInterceptor {
val request = it.request()
val response = it.proceed(request)
if (response.code() == 307) {
val url = HttpUrl.Builder()
.scheme(request.url().scheme())
.host(request.url().host())
.addPathSegment(response.header("location", request.url().url().path)?: "")
.build()
val newRequest = Request.Builder()
.method(request.method(), request.body())
.url(url)
.headers(request.headers())
.build()
[email protected] it.proceed(newRequest)
}
response
}
.build()
Retrofit.Builder().client(client).build()