添加 retrfiot 拦截器Interceptor ,打印服务器返回的json并添加网络请求公共的header

本文介绍了一个基于OkHttp的日志拦截器实现方法。该拦截器能够为HTTP请求添加必要的头部信息,并在调试模式下记录请求及响应的详细信息,包括服务器返回的数据内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.IOException;
import java.nio.charset.Charset;

import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.Buffer;
import okio.BufferedSource;

/**
 * 网络切面处理
 * Created By: AndroidStudio 
 * Author :http://write.blog.youkuaiyun.com/postedit/53446562
 *  
 */
public class OkHttpLoggingInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {

        Request.Builder newBuilder = chain
                .request()
                .newBuilder();

        Request request = newBuilder
                .addHeader("Content-Type","application/json; charset=utf-8")
                .addHeader("Authorization", Bearer )
                .build();

        String cacheControl=request.cacheControl().toString();
        if(TextUtils.isEmpty(cacheControl)){
            cacheControl = "public, max-age=60";
        }
        Response response = chain.proceed(request);

        if(BaseApplication.getInstance().isdebug){
            Log.e("ssss", "response返回参数" + response.toString());

            //添加打印服务器返回的数据
            ResponseBody responseBody = response.body();
            long contentLength = responseBody.contentLength();
            BufferedSource source = responseBody.source();
            source.request(Integer.MAX_VALUE); // Buffer the entire body.
            Buffer buffer = source.buffer();


            if (contentLength != 0) {
                Log.e("服务器返回数据:", ""+buffer.clone().readString(Charset.forName("UTF-8")));
            }
        }

        return response.
                newBuilder()
                .header("Cache-Control", cacheControl)
                .build();

    }
}

<think>我们被要求提供微信小程序网络请求的封装类,包含请求拦截器和响应拦截器的实现。根据引用[1]和[2]的提示,我们可以设计一个类,该类包含:-两个数组:requestInterceptors(请求拦截器数组)和responseInterceptors(响应拦截器数组)-添加拦截器的方法:addRequestInterceptor,addResponseInterceptor-核心的request方法,用于发送请求在发送前后执行拦截器。同时,引用[2]提到,我们可以封装get、post等方法,这些方法内部调用request方法。另外,引用[4]提到小程序不支持axios,但我们可以自己封装类似拦截器的功能。设计思路:1.定义一个类,比如叫HttpClient。2.构造函数中初始化拦截器数组。3.添加拦截器的方法:将拦截器函数(可以是异步函数)推入对应的数组。4.请求拦截器:在发送请求前,依次执行每个请求拦截器,每个拦截器可以对请求配置进行修改。5.响应拦截器:在请求返回后,依次执行每个响应拦截器,每个拦截器可以对响应数据进行处理。6.核心的request方法:接收一个配置对象(包含url、method、data、header等),返回一个Promise。7.在request方法中,先执行请求拦截器链,然后使用wx.request发送请求,再执行响应拦截器链。注意:拦截器可以是异步的,所以我们需要用Promise链来处理。参考引用[1]中的步骤:-将请求配置包装成Promise,然后依次执行请求拦截器(每个拦截器返回新的配置)。-发送请求,得到响应后,将响应数据包装成Promise,然后依次执行响应拦截器(每个拦截器返回新的响应)。但是,注意拦截器可能有多个,我们需要用reduce来组合它们。另外,考虑到错误处理:-请求拦截器链中,如果某个拦截器抛出错误,则直接进入catch。-发送请求时,如果失败,则直接进入catch,不执行响应拦截器。-响应拦截器链中,如果某个拦截器抛出错误,则进入catch。具体步骤:1.创建一个初始的请求配置,然后通过请求拦截器链依次处理。2.使用处理后的配置调用wx.request。3.将wx.request的返回包装成Promise,然后通过响应拦截器链依次处理响应。4.返回最终处理后的响应。由于微信小程序的wx.request本身不支持Promise,我们需要将其Promise化。但是,注意:我们可以直接在request方法中返回一个Promise,然后在wx.request的成功和失败回调中resolve或reject。下面我们给出一个示例代码:</think>### 微信小程序网络请求封装实现(含拦截器) 以下是基于类封装的微信小程序网络请求实现方案,包含请求拦截器和响应拦截器功能: ```javascript class HttpClient { constructor() { // 存储拦截器的数组 this.requestInterceptors = []; this.responseInterceptors = []; // 基础配置 this.config = { baseURL: 'https://api.example.com', timeout: 10000, headers: { 'Content-Type': 'application/json' } }; } // 添加请求拦截器 addRequestInterceptor(interceptor) { this.requestInterceptors.push(interceptor); } // 添加响应拦截器 addResponseInterceptor(interceptor) { this.responseInterceptors.push(interceptor); } // 核心请求方法 request(config) { // 合配置 const mergedConfig = { ...this.config, ...config }; // 创建请求拦截器链 let chain = [this.dispatchRequest, undefined]; // 请求拦截器从后往前压栈 this.requestInterceptors.forEach(interceptor => { chain.unshift(interceptor.fulfilled, interceptor.rejected); }); // 响应拦截器从前往后压栈 this.responseInterceptors.forEach(interceptor => { chain.push(interceptor.fulfilled, interceptor.rejected); }); // 创建初始Promise let promise = Promise.resolve(mergedConfig); // 执行链式调用 while (chain.length) { promise = promise.then(chain.shift(), chain.shift()); } return promise; } // 实际发送请求 dispatchRequest(config) { return new Promise((resolve, reject) => { wx.request({ url: config.baseURL + config.url, method: config.method || 'GET', data: config.data, header: config.headers, timeout: config.timeout, success: (response) => { resolve(response); }, fail: (error) => { reject(error); } }); }); } // 快捷方法 get(url, params, config = {}) { return this.request({ url, method: 'GET', data: params, ...config }); } post(url, data, config = {}) { return this.request({ url, method: 'POST', data, ...config }); } } // 使用示例 const http = new HttpClient(); // 添加请求拦截器 http.addRequestInterceptor({ fulfilled: config => { console.log('请求拦截', config); // 添加认证token config.headers.Authorization = wx.getStorageSync('token'); return config; }, rejected: error => Promise.reject(error) }); // 添加响应拦截器 http.addResponseInterceptor({ fulfilled: response => { console.log('响应拦截', response); // 统一处理状态码 if (response.statusCode !== 200) { return Promise.reject(response.data); } return response.data; }, rejected: error => { wx.showToast({ title: '网络错误', icon: 'error' }); return Promise.reject(error); } }); // 发送请求 http.get('/user/profile') .then(data => console.log('响应数据:', data)) .catch(err => console.error('请求失败:', err)); ``` ### 实现说明 1. **类结构设计**: - `HttpClient` 类封装核心功能 - `requestInterceptors` 和 `responseInterceptors` 存储拦截器 - 基础配置集中管理 2. **拦截器机制**: - 请求拦截器:在请求发送前修改配置(如添加 token) - 响应拦截器:处理响应数据和错误(如状态码检查) - 使用 Promise 链实现拦截器流水线处理[^1][^2] 3. **请求流程**: $$请求 \rightarrow 请求拦截器 \rightarrow 实际发送 \rightarrow 响应拦截器 \rightarrow 结果处理$$ 4. **扩展方法**: - 提供 `get`/`post` 等快捷方法 - 支持自定义超时时间和请求头 5. **错误处理**: - 统一错误处理逻辑 - 拦截器支持错误传递机制 ### 使用场景建议 1. **认证处理**:在请求拦截器中统一添加身份令牌 2. **API版本控制**:通过基础配置统一管理API路径 3. **错误上报**:在响应拦截器中捕获异常上报 4. **加载状态管理**:结合小程序页面生命周期显示/隐藏加载状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值