OkHttp अनुरोध अवरोधक में हेडर कैसे जोड़ें?


94

मेरे पास यह इंटरसेप्टर है जिसे मैं अपने OkHttp क्लाइंट में जोड़ता हूं:

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

मैं अपने इंटरसेप्टर में अनुरोध करने के लिए हेडर कैसे जोड़ सकता हूं?

मैंने यह कोशिश की लेकिन मैं गलती कर रहा हूं और नया अनुरोध बनाते समय मैं अपना अनुरोध खो देता हूं:

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

ध्यान दें कि, मुझे पता है कि इस तरह का अनुरोध करते समय मैं हेडर जोड़ सकता हूं:

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

लेकिन यह मेरी आवश्यकताओं के अनुरूप नहीं है। मुझे इंटरसेप्टर में इसकी आवश्यकता है।


1
आपका इंटरसेप्टर सही लगता है। इसके साथ क्या काम नहीं कर रहा है?
जेसी विल्सन

जवाबों:


153

अंत में, मैंने हेडर को इस तरह जोड़ा:

@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
किसी कारण से यह मेरे अनुरोध में हेडर नहीं जोड़ता है ?! मैं okHttp.Builder और networkInterceptors () का उपयोग कर रहा हूं। इस उत्तर में समान कोड के साथ (इंटरसेप्टर) जोड़ें, लेकिन हेडर नहीं जोड़े गए हैं।
Informatic0re

youtube रिक्वेस्ट का हेडर कैसे लगाएं? यह एक PackageName और अपने API कुंजी है और उसके बाद के माध्यम से पारित.addheader(params1, params2);
रॉक रॉक

@RoCk आपके पास अलग-अलग रिस्टोर ग्राहक हो सकते हैं जिनके पास अलग-अलग हेडर कॉन्फ़िगरेशन हैं।
मोर्तेजा रस्तोगो

27

आप इसे इस तरह से कर सकते हैं

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
यह इंटरसेप्टर नहीं है।
bekce

15

यहाँ 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();

9

यदि आप रेट्रोफिट लाइब्रेरी का उपयोग कर रहे हैं तो आप सीधे @Headerइंटरसेप्टर के उपयोग के बिना एनोटेशन का उपयोग करके एपीआई अनुरोध के लिए हेडर पास कर सकते हैं । यहाँ उदाहरण है कि पता चलता है कि हेडर को रिट्रोफिट एपीआई अनुरोध में कैसे जोड़ा जाता है।

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

आशा करता हूँ की ये काम करेगा!


4
मुझे पता है कि, लेकिन मेरे पास टोकन प्राप्त करने की एक विधि है: getToken () जो धागे पर प्रतीक्षा करता है। इसलिए यदि मैं कहता हूं कि ओकेहट्प इंटरसेप्टर में, यह रेट्रोफिट थ्रेड में चलेगा और मुझे थ्रेड मुद्दों के बारे में चिंता करने की आवश्यकता नहीं है।
मोर्टेजा रस्तगो

9

अन्य नमूनों के साथ इसी तरह का मुद्दा रहा, इस कोटलिन वर्ग ने मेरे लिए काम किया

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

6

आपके OkHttp3 (अब के रूप में नवीनतम संस्करण) में इंटरसेप्टर्स को जोड़ने का एक और तरीका है, कि क्या आप अपने Okhttp बिल्डर में इंटरसेप्टर्स जोड़ रहे हैं

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

  return chain.proceed(yourAuthorisedRequest);
});

और अंत में इस बिल्डर से अपने okHttpClient का निर्माण करें

OkHttpClient client = builder.build();

हाँ, भाग के बारे में सूचित नहीं add*Network*Interceptorकरने के बजाय addInterceptorमुझे कुछ घंटों के लिए अपने बाल खींचना पड़ा :)
Antek

1

यह मेरे लिए काम किया:

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

}

उपयोग का उदाहरण:

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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.