Retrofit全局请求头设置无效?如何为所有请求配置请求头?
Retrofit全局请求头不生效?试试这些解决方案!
嘿,我来帮你搞定这个问题!之前我也踩过Retrofit设置全局请求头不生效的坑,大概率是你配置的方式不对——Retrofit本身没有直接设置全局请求头的API,正确的做法是借助OkHttp的拦截器来实现,我给你梳理几种靠谱的实现方式:
一、静态全局请求头(固定值)
这是最常用的场景,比如设置App版本、设备类型这类固定的请求头:
- 先创建一个全局拦截器类,实现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); } }
- 把这个拦截器添加到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




