Failure: retrofit.RetrofitError: 307 Временная переадресация?

Я использую библиотеку com.squareup.retrofit:retrofit:1.9.0 , чтобы отправить данные на мой сервер с моего приложения Android.

На самом деле, когда я хочу отправить запрос на сервер, я нашел эту ошибку:

 failure : retrofit.RetrofitError: 307 Temporary Redirect 

Я пробую много идей, но одна и та же проблема сохраняется.

Пожалуйста, помогите мне решить эту проблему.

С уважением

Solutions Collecting From Web of "Failure: retrofit.RetrofitError: 307 Временная переадресация?"

Изменить: если вы не должны использовать Retrofit 1.9, переход на более новую версию (т.е. 2.0+) должен автоматически обрабатывать решение, описанное ниже.


Похоже, ваш HTTP-клиент (на стороне Android) должен обработать это перенаправление, прочитав значение Location в заголовке ответа, который вы получаете, когда это произойдет, и оно должно содержать URL-адрес целевого перенаправления, который вы должны снова ударить с клиента.

См. Их комментарий здесь .

Поэтому на данный момент вам нужно реализовать это на уровне приложения (что сложно с Retrofit 1, проще с предстоящей Retrofit 2) или дождаться OkHttp 3.1 (ish), когда мы реализуем новейшую спецификацию.

См. Также то, что означает 307 .

Исправление ошибок 307 – общий ответ 307 с веб-сервера должен всегда включать альтернативный URL-адрес, для которого должно выполняться перенаправление. Если это так, веб-браузер немедленно повторит альтернативный URL-адрес. Таким образом, вы никогда не видите ошибку 307 в веб-браузере, если, возможно, у вас есть коррумпированная цепочка перенаправления, например, URL-адрес A перенаправляется на 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 

Вы используете старую зависимость

Измените свою зависимость от "com.squareup.retrofit: 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'. 

Добавьте этот метод в свой клиентский класс RetoFit

 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 Exception

 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; } 

Попробуйте поставить 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' 

Пройдите через этот пример учебника «Дооснащение», если вы следуете другим возможностям инициирования остального клиента

Я получил решение после многих усилий. Может быть, это поможет вам. Если вы получаете эту ошибку «203 HTTP 307 Temporary Redirect», этот трюк поможет вам. Добавляем '/' к вашему веб-сервису в конце, а затем проверяем эту ошибку. Я не знаю причины этого, но он работает для меня.

Для меня мой старый веб-сервис запроса: https: // mydomain / rest / Search . Используя этот URL-адрес, я получал «203 HTTP 307 Temporary Redirect», где мне удалось получить ответ в POSTMAN и веб-браузере.

Мой новый веб-сервис запроса с трюком: https: // mydomain / rest / Search / . Это '/' разрешает проблему.