Подтвердить что ты не робот

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

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

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

failure : retrofit.RetrofitError: 307 Temporary Redirect

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

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

Привет

4b9b3361

Ответ 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()