OkHttp istek önleyicisine üstbilgiler nasıl eklenir?


95

OkHttp istemcime eklediğim şu engelleyiciye sahibim:

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

Önleyicime talep etmek için nasıl başlık ekleyebilirim?

Bunu denedim ama hata yapıyorum ve yeni istek oluştururken isteğimi kaybediyorum:

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

Bunun gibi istek oluştururken başlık ekleyebileceğimi unutmayın:

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

Ama ihtiyaçlarıma uymuyor. Önleyicide ihtiyacım var.


1
Önleyiciniz doğru görünüyor. Onunla ne çalışmıyor?
Jesse Wilson

Yanıtlar:


153

Son olarak başlıkları şu şekilde ekledim:

@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
nedense bu, üstbilgileri isteğime eklemiyor mu ?! OkHttp.Builder ve networkInterceptors () kullanıyorum. Add (interceptor) bu cevapta olduğu gibi aynı kodla, ancak başlıklar eklenmedi.
Informatic0re

youtube isteği için nasıl başlık eklenir? Bu bir packageName ve API anahtarınız mı ve sonra geçiş mi.addheader(params1, params2);
RoCk RoCk

@RoCk Farklı başlık konfigürasyonuna sahip ayrı RestClient'larınız olabilir.
Morteza Rastgoo

27

bu şekilde yapabilirsin

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
Bu bir engelleyici değil.
bekce

15

Burada yararlıdır özü gelen 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

Diğer örneklerle benzer bir sorunla karşılaşan bu Kotlin sınıfı benim için çalıştı

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

Retrofit kitaplığını @Headerkullanıyorsanız, Interceptor kullanmadan ek açıklama kullanarak başlığı api isteğine doğrudan iletebilirsiniz . Retrofit api isteğine nasıl başlık ekleneceğini gösteren bir örnek.

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

Umarım yardımcı olur!


4
Bunu biliyorum, ancak iş parçacığı üzerinde bekleyen: getToken () adlı belirteci elde etmek için bir yöntemim var. bu yüzden OkHttp önleyicide onu çağırırsam, güçlendirme iş parçacığında çalışacak ve iş parçacığı sorunları hakkında endişelenmeme gerek kalmayacak.
Murtaza Rastgoo

6

OkHttp3'ünüze (şu andaki en son sürüm) durdurucu eklemenin başka bir yolu daha var, yani durdurucuları Okhttp oluşturucunuza eklersiniz.

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

  return chain.proceed(yourAuthorisedRequest);
});

ve sonunda bu oluşturucudan okHttpClient'inizi oluşturun

OkHttpClient client = builder.build();

evet, ilgili bölümü fark değil add*Network*Interceptoryerine addInterceptorbeni :) saat çift için saçımı çekerek vardı
Antek

1

Bu benim için çalıştı:

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

}

Kullanım örneği:

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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.