如何使用OkHttp添加多个请求头

9

我是使用Retrofit 2和Okhttp来进行我的安卓项目。我想在API请求中添加多个头信息。

这是我的拦截器代码:

public class NetworkInterceptors implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {

    Request request = chain.request().newBuilder()
            .addHeader("Userid", "10034")
            .addHeader("Securitykey", "Fb47Gi")
            .build();
    return chain.proceed(request);
    }
}

这个功能无法正常工作。在服务器端,我只能获取到最后添加的头信息(在上面的例子中,我只获取到了缺少“Userid”的Securitykey)。

请帮忙解决。

2个回答

8

感谢支持,我找到了答案,这对我来说运作正常。

public class NetworkInterceptors implements Interceptor {
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {

        Request request = chain.request();
        Request newRequest;

        newRequest = request.newBuilder()
                .addHeader("Userid", "10034")
                .addHeader("Securitykey", "Fb47Gi")
                .build();
        return chain.proceed(newRequest);
    }
}

我尝试了相同的方法,但它总是选择最后一个,不知道我做错了什么。 - Kashif K.
请帮帮我,我在应用程序中发送多个标头方面遇到了困难。 - Kashif K.

2
你可以使用这个类,在用户已经登录的情况下传递上下文。原始回答是"最初的回答"。
  public class ApiClient {
        public static final String BASE_URL = "";
        private static Retrofit retrofit = null;
        static Context mcontext;

        public static Retrofit getClient(Context context,String baseUrl)
        {

            mcontext = context;

            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(220, TimeUnit.SECONDS)// Set connection timeout
                    .readTimeout(220, TimeUnit.SECONDS)// Read timeout
                    .writeTimeout(220, TimeUnit.SECONDS)// Write timeout
                    .addInterceptor( HeaderInterceptor() )

                  //  .addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)// Add cache interceptor
                   // .cache(cache)// Add cache
                    .build();

            Gson gson = new GsonBuilder()
                    .setLenient()
                    .create();
            if (retrofit == null) {
                retrofit = new Retrofit.Builder()
                        .baseUrl(baseUrl)
                        .client(okHttpClient)
                        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                        .addConverterFactory(GsonConverterFactory.create(gson))
                        .build();
            }
            return retrofit;
        }

        private static Interceptor HeaderInterceptor() {
            return new Interceptor() {
                @Override
                public okhttp3.Response intercept(Chain chain) throws IOException {
                    okhttp3.Request request = chain.request();
                    if(SharedPreference.getlogin(mcontext).equals("")){
                        request = request.newBuilder()
                                .addHeader("Accept", "application/json")
                                .addHeader("Authorization", "Bearer "+SharedPreference.gettoken(mcontext))
                                .build();
                    }
                    else {
                        request = request.newBuilder()
                                .addHeader("Accept", "application/json")
                                .build();
                    }


                    okhttp3.Response response = chain.proceed(request);
                    return response;
                }
            };
        }


    }

这是完美的解决方案!!对于图像(“Accept”,“image/jpg”)和(“Content-Type”,“image/jpg”),它非常理想! - chatlanin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接