Interceptor 网络拦截器 切换网络请求

package com.mylibrary;

import android.text.TextUtils;
import android.util.Log;

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

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


/**
 * @author lsw
 * @date 2018/4/19
 */
public class MyLoggingInterceptor implements Interceptor {


    private String bearer;
    private String tag = "lsw";
    private String appType;

    public MyLoggingInterceptor(String bearer) {
        this.bearer = bearer;
    }

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

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

        Request request;
        if (!bearer.isEmpty()) {
            request = newBuilder
                    .addHeader("Authorization", bearer)
//                    .addHeader("appType",appType)
                    .build();
        } else {
            request = newBuilder.build();
        }

        String cacheControl = request.cacheControl().toString();
        if (TextUtils.isEmpty(cacheControl)) {
            cacheControl = "public, max-age=60";
        }
        Response response = chain.proceed(request);
        Log.e(tag, "========response' code : " + response.code());

        if(response.code() == 200){
            Response.Builder builder = response.newBuilder();
            Response clone = builder.build();

            ResponseBody body = clone.body();
            if (body != null) {
                MediaType mediaType = body.contentType();
                if (mediaType != null) {
//                Log.e(tag, "responseBody's contentType : " + mediaType.toString());
                    if (isText(mediaType)) {
                        String resp = body.string();
                        body = ResponseBody.create(mediaType, resp);

                        return response.newBuilder().body(body).build();
                    } else {
                        Log.e(tag, "responseBody's content : " + " maybe [file part] , too large too print , ignored!");
                    }
                }
            }
        }else{
//            Log.e(tag, "调用检测接口: " );
            //修改网络 请求
            String json =  "{  \"body\": {\"appType\": \""+appType+"\",\"versionType\": \"2\"  },\"head\": {}}" ;
//            Log.e(tag, "调用检测接口: "  + bearer);
//            Log.e(tag, "json -- : "  + json);

            RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
            Request newRequest = new Request.Builder()
                    .addHeader("Authorization", this.bearer)
                    .url("http://192.168.0.1/openapi/oauth/service/XXX").post(body).build();
            response = chain.proceed(newRequest);
//            Log.e(tag, "body : "  + response.body().toString());
//            Log.e(tag, "response code new  : "  + response.code());
            //添加打印服务器返回的数据
            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();
        return response;

    }

    private boolean isText(MediaType mediaType) {
        if (mediaType.type() != null && mediaType.type().equals("text")) {
            return true;
        }
        if (mediaType.subtype() != null) {
            if (mediaType.subtype().equals("json") ||
                    mediaType.subtype().equals("xml") ||
                    mediaType.subtype().equals("html") ||
                    mediaType.subtype().equals("webviewhtml")
                    )
                return true;
        }
        return false;
    }

    public void setBearer(String bearer,String appType) {
        this.bearer = bearer;
        this.appType = appType;
    }

    public void setBearer(String bearer) {
        this.bearer = bearer;

    }
}

 

在Java中,可以使用拦截器interceptor)来实现对方法或请求的拦截,从而实现动态切换数据源的功能。 在使用拦截器时,通常需要定义一个拦截器类,该类实现了Spring提供的`HandlerInterceptor`接口,并且重写了其中的方法,例如`preHandle`方法,用于在请求处理之前进行拦截。 在`preHandle`方法中,可以根据需要动态切换数据源。假设系统有两个数据源,分别为数据源1和数据源2,可以在拦截器中通过一定的规则来动态选择使用哪个数据源。例如可以通过判断请求中的某些参数或者请求头来进行选择。 以下是一个简单的示例代码,用于在拦截器中根据请求参数来动态切换数据源: ```java public class DataSourceInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String dataSourceKey = request.getParameter("dataSourceKey"); if ("dataSource1".equals(dataSourceKey)) { DataSourceContextHolder.setDataSourceKey("dataSource1"); } else { DataSourceContextHolder.setDataSourceKey("dataSource2"); } return true; } } ``` 在上面的代码中,`DataSourceContextHolder`是一个自定义的类,用于保存当前线程的数据源选择。在`preHandle`方法中,根据请求参数`dataSourceKey`的值来选择使用哪个数据源,并将选择结果保存在`DataSourceContextHolder`中。这样,当后续的数据库操作需要使用数据源时,可以从`DataSourceContextHolder`中获取当前选择的数据源。 需要注意的是,拦截器只能对经过Spring MVC框架的请求进行拦截,如果直接调用Java方法,则无法进行拦截。如果需要对Java方法进行拦截,可以考虑使用AOP技术来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值