Retrofit 2.4请求头末尾自动添加换行符导致请求失败的解决方法
解决Retrofit v2.4请求头换行符导致请求失败的问题
这个问题我之前帮团队排查过,Retrofit 2.4版本确实存在一个已知的小bug——在处理请求头时会意外插入换行符,尤其是在通过拦截器或手动构建Header的场景下,很容易导致服务端解析请求头失败。结合你的示例,我整理了几个可行的解决办法:
1. 优先升级Retrofit版本(最省心的方案)
Square在Retrofit 2.5.0版本已经修复了这个请求头换行的问题,直接升级到稳定的新版本是最彻底的解决方式。你只需要修改项目的依赖配置:
如果用Gradle,更新Retrofit的依赖:
implementation 'com.squareup.retrofit2:retrofit:2.9.0' // 可选择最新稳定版,比如2.9.0或更高
升级后不需要额外修改代码,原有请求逻辑就能正常工作。
2. 无法升级时,用OkHttp拦截器清理请求头
如果因为项目兼容性问题暂时不能升级版本,可以通过OkHttp的拦截器手动清理请求头中的换行符。具体代码如下:
// 创建自定义拦截器,清理请求头中的换行、回车符 OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(chain -> { Request originalRequest = chain.request(); Request.Builder requestBuilder = originalRequest.newBuilder(); // 处理Authorization头(你遇到的核心问题点) String authHeader = originalRequest.header("Authorization"); if (authHeader != null) { // 移除所有换行符和回车符 String cleanedAuth = authHeader.replaceAll("\\r|\\n", ""); requestBuilder.header("Authorization", cleanedAuth); } // 如果还有其他可能受影响的请求头,也可以用同样方式处理 return chain.proceed(requestBuilder.build()); }) .build(); // 将处理后的OkHttpClient传给Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl("你的基础接口地址") .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build();
3. 检查Header构建时的拼写和编码问题
另外注意到你的示例请求头写的是 Authorization: Base dXNlcm5hbWU6cGFzc3dvcmQ=,这里有个小错误:HTTP标准的Basic认证前缀应该是Basic而不是Base,这个拼写错误本身也会导致认证失败,建议先修正这个问题。
同时,生成Base64编码时,要确保不生成换行符。比如在Android中使用Base64.encodeToString时,要指定Base64.NO_WRAP参数:
String credentials = "username:password"; // 用NO_WRAP避免生成带换行的Base64字符串 String base64 = Base64.encodeToString(credentials.getBytes(StandardCharsets.UTF_8), Base64.NO_WRAP); String authHeader = "Basic " + base64;
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

