Okhttp设置请求日志过滤器,支持打印Post请求参数

来源:互联网 发布:2017杭州程序员招聘 编辑:程序博客网 时间:2024/05/06 11:58

在网络请求的时候我们一般会打印日志,包含请求地址、请求参数、返回结果、请求耗时等。

在之前的操作中,可能会,在Request执行的时候打印一下,Response返回结果的时候打印一下。那么这样在如果同时多个请求的情况下就会产生混乱,日志里会出现并列多个请求,并列多个结果。那么使用Okhttp的过滤器便能解决这一问题
代码如下:

public class LogInterceptor implements Interceptor {    public static String TAG = "LogInterceptor";    @Override    public okhttp3.Response intercept(Chain chain) throws IOException {        Request request = chain.request();        long startTime = System.currentTimeMillis();        okhttp3.Response response = chain.proceed(chain.request());        long endTime = System.currentTimeMillis();        long duration=endTime-startTime;        okhttp3.MediaType mediaType = response.body().contentType();        String content = response.body().string();        Log.d(TAG,"\n");        Log.d(TAG,"----------Start----------------");        Log.d(TAG, "| "+request.toString());        String method=request.method();        if("POST".equals(method)){            StringBuilder sb = new StringBuilder();            if (request.body() instanceof FormBody) {                FormBody body = (FormBody) request.body();                for (int i = 0; i < body.size(); i++) {                    sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ",");                }                sb.delete(sb.length() - 1, sb.length());                Log.d(TAG, "| RequestParams:{"+sb.toString()+"}");            }        }        Log.d(TAG, "| Response:" + content);        Log.d(TAG,"----------End:"+duration+"毫秒----------");        return response.newBuilder()                .body(okhttp3.ResponseBody.create(mediaType, content))                .build();    }}

Get和Post是两种常见的请求方式,网上很多文章只是说明了打印请求地址,在Get请求时候这个参数会拼接在请求地址后面,而Post请求的参数是在请求体里面的,因此必需要先获取到请求体然后遍历,拿到请求参数。因此上面代码中的这部分是为了打印Post请求参数而来。

String method=request.method();        if("POST".equals(method)){            StringBuilder sb = new StringBuilder();            if (request.body() instanceof FormBody) {                FormBody body = (FormBody) request.body();                for (int i = 0; i < body.size(); i++) {                    sb.append(body.encodedName(i) + "=" + body.encodedValue(i) + ",");                }                sb.delete(sb.length() - 1, sb.length());                Log.d(TAG, "| RequestParams:{"+sb.toString()+"}");            }        }

具体过滤器使用方式很简单在实例化httpClient的时候addInterceptor即可:

OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(new LogInterceptor())                .connectTimeout(10, TimeUnit.SECONDS)                .readTimeout(10, TimeUnit.SECONDS)                .writeTimeout(10, TimeUnit.SECONDS)                .retryOnConnectionFailure(false)                .build();

据说要配个图才好看
Paste_Image.png

0 0
原创粉丝点击