OkHttp অনুরোধ ইন্টারসেপ্টারে কীভাবে শিরোনাম যুক্ত করবেন?


95

আমার এই ইন্টারসেপ্টরটি রয়েছে যা আমি আমার 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();

তবে এটি আমার প্রয়োজনের সাথে খাপ খায় না। আমার এটি ইন্টারসেপ্টারে দরকার।


4
আপনার ইন্টারসেপ্টরটি ঠিক দেখাচ্ছে। এটি দিয়ে কি কাজ করছে না?
জেসি উইলসন

উত্তর:


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

4
কোনও কারণে এটি আমার অনুরোধে শিরোনাম যুক্ত করে না ?! আমি এই উত্তরের মতো একই কোড সহ OkHttp.Builder এবং नेटवर्कInterceptors ()। যুক্ত (ইন্টারসেপ্টর) ব্যবহার করছি, তবে শিরোনাম যুক্ত করা হয়নি।
ইনফরম্যাটিক0

ইউটিউব অনুরোধের জন্য একটি শিরোনাম কীভাবে যুক্ত করবেন? এটি কি কোনও প্যাকেজনাম এবং আপনার এপিআই কী এবং তারপরে .addheader(params1, params2);
কেটে

@ রোকক আপনার আলাদা আলাদা রেস্টক্লিনেন্ট থাকতে পারে যার বিভিন্ন শিরোনামের কনফিগারেশন রয়েছে।
মরতেজা রাস্টগু

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

4
এটি কোনও ইন্টারসেপ্টার নয়।
বেকস

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

10

অন্যান্য নমুনাগুলির সাথে একই রকম সমস্যার মুখোমুখি এই কোটলিন ক্লাসটি আমার পক্ষে কাজ করেছিল

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

আপনি যদি রেট্রোফিট লাইব্রেরি ব্যবহার করছেন তবে আপনি @Headerইন্টারসেপ্টারের ব্যবহার ছাড়াই টীকাটি ব্যবহার করে সরাসরি এপিআই-র অনুরোধে শিরোনামটি পাস করতে পারেন । এখানে উদাহরণ রয়েছে যা দেখায় যে কীভাবে retrofit এপিআই অনুরোধে শিরোলেখ যুক্ত করা যায়।

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

আশা করি এটা সাহায্য করবে!


4
আমি এটি জানি, তবে আমার কাছে টোকেন নামকটি পাওয়ার একটি পদ্ধতি রয়েছে: গেটটোকেন () যা থ্রেডে অপেক্ষা করে। সুতরাং যদি আমি ওকে এইচটিটিপি ইন্টারসেপ্টারে কল করি তবে এটি রিট্রোফিট থ্রেডে চলবে এবং থ্রেড সংক্রান্ত সমস্যা নিয়ে আমার মাথা ঘামানোর দরকার নেই।
মরতেজা রাস্টগু

6

আপনার ওকে এইচটিপি 3 (এখনকার হিসাবে সর্বশেষতম সংস্করণ) এ ইন্টারসেপ্টর যুক্ত করার আরও একটি উপায় রয়েছে, এটি হ'ল আপনি নিজের ওখট্টপ নির্মাতাকে ইন্টারসেপ্টর যুক্ত করেছেন

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

  return chain.proceed(yourAuthorisedRequest);
});

এবং অবশেষে এই বিল্ডার থেকে আপনার OkHttpClient তৈরি করুন

OkHttpClient client = builder.build();

হ্যাঁ, কয়েক ঘন্টার জন্য আমার চুল টানার add*Network*Interceptorপরিবর্তে অংশটি লক্ষ্য addInterceptorকরছি না :)
আনটেক

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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.