retrofit怎么针对不同的url统一添加header?

发布于 2022-09-03 11:43:04 字数 458 浏览 26 评论 0

目前我是使用retrofit来作为我的网络请求框架,对某些请求还需要加headers。我在官网查到有@Header标签来指定header参数,但是这样写的话太繁琐,如果service中方法比较多的话,不是要写死了。又在网上又查了下,可以使用自定义的OkHttpClient来实现,然后使用:

Retrofit retrofit = new Retrofit.Builder()  
            .baseUrl(SERVER_URL)  
            .client(genericClient())  
            .build();

但是这种做法的话,就会把所有使用这个retrofit的url都加上了header,但是部分url是不需要的,比如我只是想在需要授权的url调用上都加上header参数(header里面加token)。找了半天网上没有相关的文章,所以请SF的朋友们回答下,谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

活雷疯 2022-09-10 11:43:04

我是这么写的

OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
builder.addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException, java.io.IOException {
        Request request = chain.request().newBuilder()
                .addHeader("Source", "android")
                .addHeader("Accept", "application/json,text/javascript,*/*")
                .build();
        return chain.proceed(request);
    }
});
OkHttpClient client = builder.build();

retrofit = new Retrofit.Builder()
        .baseUrl(BASE_TRC_URL)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create(getGson()))
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .build();

但是这样不能统一加token

柠檬 2022-09-10 11:43:04

使用okhttp的interceptor就可以

一百个冬季 2022-09-10 11:43:04

我也遇到了这样的问题,我写了一个拦截器

public final class TokenInterceptor extends Application implements Interceptor{
    private static final String TAG="TokenInterceptor";
    private static final String USER_TOKEN = "Authorization";
    private String token;
    public TokenInterceptor(String token) {
        this.token = token;
        Log.d(TAG,"tk1:"+token);
    }
    @Override
    public Response intercept(Chain chain) throws IOException {
        final Request originalRequest = chain.request();
        Log.d(TAG,"url=============="+originalRequest.url()+"\ttoken:"+token);
        Log.d(TAG,"header:"+originalRequest.header("Authorization") );
        if(token.isEmpty() || token == null || originalRequest.header("Authorization") != null){
            Log.d(TAG,"if true");
            return chain.proceed(originalRequest);
        }
        Request request = originalRequest.newBuilder()
                .header(USER_TOKEN,"Token "+token)
                .build();
        return chain.proceed(request);
    }
}

然后用okhttp client调用

OkHttpClient.Builder builder = new OkHttpClient.Builder();

builder.addNetworkInterceptor(new TokenInterceptor(tk));
冰雪梦之恋 2022-09-10 11:43:04

我终于明白了,其实客户端不要区分的那么细,从本地配置文件取token,有就传,没有就不传,后台做好控制哪些url需要,哪些url不需要就可以。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文