Проблема с перехватчиком Okhttp - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь добавить заголовок к простому запросу okhttp (Get). Как правильно добавить HttpHeader? Могу ли я выполнить отладку, чтобы убедиться, что мой заголовок действительно отправлен на сервер?

        Request request = new Request.Builder()
                .url("URL")
                .build();

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new Interceptor() {
                    @Override
                    public okhttp3.Response intercept(Chain chain) throws IOException {
                        Request originalRequest = chain.request();
                        Request newRequest = originalRequest.newBuilder()
                                .addHeader("Header", "123")
                                .build();
                        return chain.proceed(newRequest);
                    }
                })
                .build();

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
             }

Я искал основные c простые примеры, но они были с Retrofit, GSON, Interfaces или в Kotlin. Необходимо понимать это кодовое слово.

Ответы [ 3 ]

1 голос
/ 30 мая 2020

Вы можете использовать цепочку отправки методом addHeader в качестве параметра и добавлять заголовки.

 Request getRequest = chain.request();
        Request.Builder requestBuilder = getRequest.newBuilder()
            .addHeader("Header", "123");
        Request request = requestBuilder.build();
        return chain.proceed(request);

Вы также можете посетить и посмотреть ответы link1 и link2 .

Вот структура всех запросов, которую вы можете использовать.

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.addInterceptor(new Interceptor() {
            @Override
            public Response intercept(Interceptor.Chain chain) throws IOException {
                Request original = chain.request();

                Request request = original.newBuilder()
                        .method(original.method(), original.body())
                        .build();

                return chain.proceed(request);
            }
        };
        OkHttpClient client = httpClient.build();

        Request request = new Request.Builder()
                .url("URL")
                .addHeader("Header", "123")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                Log.d("OKHTTP3", e.getMessage());
                // You get this failure
                runOnUiThread(() -> {

                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                try {
                    final String _body = response.body().string();
                    Log.d("OKHTTP3", _body);
                    runOnUiThread(() -> {

                    });
                } catch (InterruptedIOException e) {
                    runOnUiThread(() -> {
                        // Or this exception depending when timeout is reached

                    });
                }
            }
        });
0 голосов
/ 30 мая 2020

Для проверки вашего запроса и добавления заголовков вы можете использовать перехватчики.

Чтобы добавить заголовки, (скопировано из gist ):

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();  
httpClient.addInterceptor(new Interceptor() {  
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
        Request original = chain.request();

        Request request = original.newBuilder()
            .header("User-Agent", "Your-App-Name")
            .header("Accept", "application/vnd.yourapi.v1.full+json")
            .method(original.method(), original.body())
            .build();

        return chain.proceed(request);
    }
}

OkHttpClient client = httpClient.build();  
Retrofit retrofit = new Retrofit.Builder()  
    .baseUrl(API_BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .client(client)
    .build();

Чтобы увидеть ваши заголовки, вы можете использовать приведенный пример здесь :

class LoggingInterceptor implements Interceptor {
  @Override public Response intercept(Interceptor.Chain chain) throws IOException {
    Request request = chain.request();

    long t1 = System.nanoTime();
    logger.info(String.format("Sending request %s on %s%n%s",
        request.url(), chain.connection(), request.headers()));

    Response response = chain.proceed(request);

    long t2 = System.nanoTime();
    logger.info(String.format("Received response for %s in %.1fms%n%s",
        response.request().url(), (t2 - t1) / 1e6d, response.headers()));

    return response;
  }
}
0 голосов
/ 30 мая 2020

Используйте addHeader() для добавления заголовков. header() устанавливает значение уже добавленного имени заголовка.

Request newRequest = originalRequest.newBuilder()
    .addHeader("Header", "123")
    .build();

И чтобы убедиться, что он работает правильно, вы можете использовать HttpLoggingInterceptor для регистрации ваших сетевых запросов.

...