如何在request.newBuilder()中使用httpLoggingInterceptor打印接口日志
问题排查与解决方案
核心问题原因
你混淆了Request.Builder和OkHttpClient.Builder的API范围:client()方法属于OkHttpClient.Builder的成员方法,Request.Builder本身不提供该方法,因此在request.newBuilder()的调用链中无法找到该方法。
你之前的调研结论存在理解偏差,配置日志打印不需要给Request对象设置客户端,只需要用你已经配置好日志拦截器的OkHttpClient实例发起请求即可。
正确实现步骤
- 你现有的
OkHttpClient配置、Request头部处理逻辑完全无需修改,只需要在发起请求时使用你创建的带日志拦截器的okHttpClient实例即可,日志会自动输出到Logcat。 - 完整示例代码如下:
// 配置带日志拦截器的OkHttpClient(你的原有代码逻辑正确) val httpLoggingInterceptor = HttpLoggingInterceptor() httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY) val okHttpClient: OkHttpClient = OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).build() // 构建带动态头部的Request(你的原有逻辑正确,无需调整) when { UserInfo.loginStatus -> { request = request.newBuilder() .header("Authorization", UserInfo.token) .build() } else -> { request = request.newBuilder().build() } } // 用配置好的okHttpClient发起请求,即可自动打印请求/响应日志 okHttpClient.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { // 自定义请求失败处理逻辑 } override fun onResponse(call: Call, response: Response) { // 自定义请求成功处理逻辑 } })
单请求自定义客户端的正确写法
如果你需要为单个请求单独配置特殊的客户端参数,不要修改Request,而是基于已有OkHttpClient实例衍生定制:
// 基于全局配置衍生单请求专用客户端 val singleRequestClient = okHttpClient.newBuilder() .connectTimeout(10, TimeUnit.SECONDS) // 可添加其他定制配置 .build() // 用定制客户端发起请求 singleRequestClient.newCall(request).enqueue(...)
内容的提问来源于stack exchange,提问作者Hubby Tiwari
相关产品推荐
相关产品推荐

