You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Retrofit全局请求头设置无效?如何为所有请求配置请求头?

Retrofit全局请求头不生效?试试这些解决方案!

嘿,我来帮你搞定这个问题!之前我也踩过Retrofit设置全局请求头不生效的坑,大概率是你配置的方式不对——Retrofit本身没有直接设置全局请求头的API,正确的做法是借助OkHttp的拦截器来实现,我给你梳理几种靠谱的实现方式:

一、静态全局请求头(固定值)

这是最常用的场景,比如设置App版本、设备类型这类固定的请求头:

  1. 先创建一个全局拦截器类,实现OkHttp的Interceptor接口:
class GlobalStaticHeaderInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        // 获取原始请求
        Request originalRequest = chain.request();
        // 给请求添加全局头
        Request modifiedRequest = originalRequest.newBuilder()
                .addHeader("App-Version", "1.0.0") // 替换成你的请求头Key和Value
                .addHeader("Device-Type", "Android")
                .build();
        // 继续执行请求
        return chain.proceed(modifiedRequest);
    }
}
  1. 把这个拦截器添加到OkHttpClient,再关联到Retrofit实例:
// 构建带拦截器的OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .addInterceptor(new GlobalStaticHeaderInterceptor())
        .build();

// 构建Retrofit时一定要传入这个自定义的OkHttpClient!
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://your-server-base-url.com/")
        .client(okHttpClient) // 这一步绝对不能忘!很多人就是漏了这个导致头不生效
        .addConverterFactory(GsonConverterFactory.create())
        .build();

二、动态全局请求头(比如用户Token)

如果请求头的值需要动态变化(比如登录后的Auth Token),可以在拦截器里动态获取:

class GlobalDynamicHeaderInterceptor implements Interceptor {
    private final Context mContext;

    public GlobalDynamicHeaderInterceptor(Context context) {
        mContext = context;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        // 从本地存储(比如SharedPreferences)获取动态值
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
        String authToken = prefs.getString("user_auth_token", "");

        Request modifiedRequest = chain.request().newBuilder()
                .addHeader("Authorization", "Bearer " + authToken)
                .build();
        return chain.proceed(modifiedRequest);
    }
}

同样要把这个拦截器添加到OkHttpClient,再传给Retrofit。

三、常见坑点排查

如果按照上面的方法还是不生效,检查这几点:

  • 有没有把自定义OkHttpClient传给Retrofit? 要是你用了Retrofit默认的client,拦截器根本不会被执行
  • 是不是用了Network Interceptor? 全局请求头建议用addInterceptor()(Application Interceptor),addNetworkInterceptor()是网络级拦截器,会受缓存、重定向等影响,场景不对的话可能不生效
  • 请求头的Key/Value有没有拼写错误? 比如大小写、多余空格,服务器可能识别不到这些不规范的头

内容的提问来源于stack exchange,提问作者RedBounce

火山引擎 最新活动