Làm cách nào để thêm tiêu đề vào trình chặn yêu cầu OkHttp?


95

Tôi có bộ chặn này mà tôi thêm vào ứng dụng khách OkHttp của mình:

public class RequestTokenInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
  Request request = chain.request();
  // Here where we'll try to refresh token.
  // with an retrofit call
  // After we succeed we'll proceed our request
  Response response = chain.proceed(request);
  return response;
}
}

Làm cách nào tôi có thể thêm tiêu đề để yêu cầu trong bộ chặn của mình?

Tôi đã thử điều này nhưng tôi đang mắc lỗi và tôi mất yêu cầu khi tạo yêu cầu mới:

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

        try {
            Log.d("addHeader", "Before");
            String token = TokenProvider.getInstance(mContext).getToken();
            newRequest = request.newBuilder()
                    .addHeader(HeadersContract.HEADER_AUTHONRIZATION, O_AUTH_AUTHENTICATION + token)
                    .addHeader(HeadersContract.HEADER_CLIENT_ID, CLIENT_ID)
                    .build();
        } catch (Exception e) {
            Log.d("addHeader", "Error");
            e.printStackTrace();
            return chain.proceed(request);
        }

        Log.d("addHeader", "after");
        return chain.proceed(newRequest);
    }
}

Lưu ý rằng, tôi biết tôi có thể thêm tiêu đề khi tạo yêu cầu như thế này:

Request request = new Request.Builder()
    .url("https://api.github.com/repos/square/okhttp/issues")
    .header("User-Agent", "OkHttp Headers.java")
    .addHeader("Accept", "application/json; q=0.5")
    .addHeader("Accept", "application/vnd.github.v3+json")
    .build();

Nhưng nó không phù hợp với nhu cầu của tôi. Tôi cần nó trong máy bay đánh chặn.


1
Người đánh chặn của bạn có vẻ đúng. Điều gì không hoạt động với nó?
Jesse Wilson

Câu trả lời:


153

Cuối cùng, tôi đã thêm các tiêu đề theo cách này:

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

        newRequest = request.newBuilder()
                .addHeader(HeadersContract.HEADER_AUTHONRIZATION, O_AUTH_AUTHENTICATION)
                .addHeader(HeadersContract.HEADER_X_CLIENT_ID, CLIENT_ID)
                .build();
        return chain.proceed(newRequest);
    }

1
vì lý do nào đó mà điều này không thêm tiêu đề vào yêu cầu của tôi ?! Tôi đang sử dụng okHttp.Builder và networkInterceptors (). Add (interceptor) với cùng một mã như trong câu trả lời này, nhưng các tiêu đề không được thêm vào.
Informatic0re

làm thế nào để thêm tiêu đề cho yêu cầu youtube? Nó có phải là packageName và khóa API của bạn rồi chuyển qua không.addheader(params1, params2);
RoCk RoCk

@RoCk Bạn có thể có các RestClients riêng biệt có cấu hình tiêu đề khác nhau.
Morteza Rastgoo

27

bạn có thể làm theo cách này

private String GET(String url, Map<String, String> header) throws IOException {
        Headers headerbuild = Headers.of(header);
        Request request = new Request.Builder().url(url).headers(headerbuild).
                        build();

        Response response = client.newCall(request).execute();
        return response.body().string();
    }

5
Đây không phải là thiết bị đánh chặn.
bekce

15

đây là một ý kiến hữu ích từ lfmingo

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();

10

Đối mặt với vấn đề tương tự với các mẫu khác, lớp Kotlin này phù hợp với tôi

import okhttp3.Interceptor
import okhttp3.Response

class CustomInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain) : Response {               
        val request = chain.request().newBuilder()
            .header("x-custom-header", "my-value")
            .build()
        return chain.proceed(request)
    }
}

9

Nếu bạn đang sử dụng thư viện Retrofit thì bạn có thể chuyển trực tiếp tiêu đề đến yêu cầu api bằng cách sử dụng @Headerchú thích mà không cần sử dụng Interceptor. Đây là ví dụ cho thấy cách thêm tiêu đề vào yêu cầu trang bị thêm api.

@POST(apiURL)
void methodName(
        @Header(HeadersContract.HEADER_AUTHONRIZATION) String token,
        @Header(HeadersContract.HEADER_CLIENT_ID) String token,
        @Body TypedInput body,
        Callback<String> callback);

Hy vọng nó giúp!


4
Tôi biết điều đó, nhưng tôi có một phương pháp để lấy mã thông báo có tên: getToken () đã chờ trên chuỗi. vì vậy nếu tôi gọi nó trong bộ chặn OkHttp, nó sẽ chạy trong chuỗi trang bị thêm và tôi không cần phải lo lắng về các vấn đề của chuỗi.
Morteza Rastgoo

6

Có một cách khác để thêm bộ đánh chặn trong OkHttp3 của bạn (phiên bản mới nhất hiện tại), đó là bạn thêm bộ đánh chặn vào trình tạo Okhttp của mình

okhttpBuilder.networkInterceptors().add(chain -> {
 //todo add headers etc to your AuthorisedRequest

  return chain.proceed(yourAuthorisedRequest);
});

và cuối cùng xây dựng okHttpClient của bạn từ trình tạo này

OkHttpClient client = builder.build();

vâng, không để ý đến phần add*Network*Interceptorthay vì để addInterceptortôi kéo tóc trong vài giờ :)
Antek

1

Điều này đã làm việc cho tôi:

class JSONHeaderInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain) : Response {
        val request = chain.request().newBuilder()
            .header("Content-Type", "application/json")
            .build()
        return chain.proceed(request)
    }
}
fun provideHttpClient(): OkHttpClient {
    val okHttpClientBuilder = OkHttpClient.Builder()
    okHttpClientBuilder.addInterceptor(JSONHeaderInterceptor())
    return okHttpClientBuilder.build()
}

0
package com.example.network.interceptors;

import androidx.annotation.NonNull;

import java.io.IOException;
import java.util.Map;

import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

public class RequestHeadersNetworkInterceptor implements Interceptor {

    private final Map<String, String> headers;

    public RequestHeadersNetworkInterceptor(@NonNull Map<String, String> headers) {
        this.headers = headers;
    }

    @NonNull
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request.Builder builder = chain.request().newBuilder();
        for (Map.Entry<String, String> header : headers.entrySet()) {
            if (header.getKey() == null || header.getKey().trim().isEmpty()) {
                continue;
            }
            if (header.getValue() == null || header.getValue().trim().isEmpty()) {
                builder.removeHeader(header.getKey());
            } else {
                builder.header(header.getKey(), header.getValue());
            }
        }
        return chain.proceed(builder.build());
    }

}

Ví dụ về cách sử dụng:

httpClientBuilder.networkInterceptors().add(new RequestHeadersNetworkInterceptor(new HashMap<String, String>()
{
    {
        put("User-Agent", getUserAgent());
        put("Accept", "application/json");
    }
}));

0
client = new OkHttpClient();

        Request request = new Request.Builder().header("authorization", token).url(url).build();
        MyWebSocketListener wsListener = new MyWebSocketListener(LudoRoomActivity.this);
        client.newWebSocket(request, wsListener);
        client.dispatcher().executorService().shutdown();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.