精华内容
下载资源
问答
  • okhttp日志打印拦截器

    2017-10-23 08:13:17
    public class LogInterceptor implements Interceptor {  public static String TAG = "LogInterceptor"; ... public Response intercept(Interceptor.Chain chain) throws IOException
    p
    ublic class LogInterceptor implements Interceptor {


        public static String TAG = "LogInterceptor";


        @Override
        public Response intercept(Interceptor.Chain chain) throws IOException {
            Request request = chain.request();
            long startTime = System.currentTimeMillis();
            Response response = chain.proceed(chain.request());
            long endTime = System.currentTimeMillis();
            long duration=endTime-startTime;
            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(ResponseBody.create(mediaType, content))
                    .build();
        }
    }
    展开全文
  • 用了okhttp官方的HttpLoggingInterceptor日志打印,发现上传大文件时会出现内存溢出问题。 写了个拦截器屏蔽了文件类型。能够打印method、url、header、参数和返回内容,以及请求耗时时间。 import android.os....

    用了okhttp官方的HttpLoggingInterceptor日志打印,发现上传大文件时会出现内存溢出问题。

    写了个拦截器屏蔽了文件类型。能够打印method、url、header、参数和返回内容,以及请求耗时时间。

    import android.os.SystemClock;
    import android.text.TextUtils;
    import android.util.Log;
    
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    
    import okhttp3.Headers;
    import okhttp3.Interceptor;
    import okhttp3.MediaType;
    import okhttp3.MultipartBody;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    import okhttp3.ResponseBody;
    import okio.Buffer;
    
    public class LogInterceptor implements Interceptor {
    
        public static String TAG = LogInterceptor.class.getSimpleName();
    
        private static HashMap<String,String> headerIgnoreMap = new HashMap<>();
    
        static {
            headerIgnoreMap.put("Host", "");
            headerIgnoreMap.put("Connection", "");
            headerIgnoreMap.put("Accept-Encoding", "");
        }
    
        protected void log(String message) {
            Log.d(TAG, message);
        }
    
        private boolean isPlainText(MediaType mediaType) {
            if (null != mediaType) {
                String mediaTypeString = (null != mediaType ? mediaType.toString() : null);
                if (!TextUtils.isEmpty(mediaTypeString)) {
                    mediaTypeString = mediaTypeString.toLowerCase();
                    if (mediaTypeString.contains("text") || mediaTypeString.contains("application/json")) {
                        return true;
                    }
                }
            }
            return false;
        }
    
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
    
            long startTime = SystemClock.elapsedRealtime();
            okhttp3.Response response = chain.proceed(chain.request());
            long endTime = SystemClock.elapsedRealtime();
            long duration = endTime - startTime;
    
    
            //url
            String url = request.url().toString();
            log("----------Request Start----------");
            log("" + request.method() + " " + url);
    
            //headers
            Headers headers = request.headers();
            if (null != headers) {
                for (int i = 0, count = headers.size(); i < count; i++) {
                    if (!headerIgnoreMap.containsKey(headers.name(i))) {
                        log(headers.name(i) + ": " + headers.value(i));
                    }
                }
            }
    
            //param
            RequestBody requestBody = request.body();
            String paramString = readRequestParamString(requestBody);
            if (!TextUtils.isEmpty(paramString)) {
                log("Params:" + paramString);
            }
    
            //response
            ResponseBody responseBody = response.body();
            String responseString = "";
            if (null != responseBody) {
                if (isPlainText(responseBody.contentType())) {
                    responseString = readContent(response);
                } else {
                    responseString = "other-type="+ responseBody.contentType();
                }
            }
    
            log("Response Body:" + responseString);
            log("Time:" + duration + " ms");
            log("----------Request End----------");
            return response;
        }
    
        private String readRequestParamString(RequestBody requestBody) {
            String paramString;
            if (requestBody instanceof MultipartBody) {//判断是否有文件
                StringBuilder sb = new StringBuilder();
                MultipartBody body = (MultipartBody) requestBody;
                List<MultipartBody.Part> parts = body.parts();
                RequestBody partBody;
                for (int i = 0, size = parts.size(); i < size; i++) {
                    partBody = parts.get(i).body();
                    if (null != partBody) {
                        if (sb.length() > 0) {
                            sb.append(",");
                        }
                        if (isPlainText(partBody.contentType())) {
                            sb.append(readContent(partBody));
                        } else {
                            sb.append("other-param-type=").append(partBody.contentType());
                        }
                    }
                }
                paramString = sb.toString();
            } else {
                paramString = readContent(requestBody);
            }
            return paramString;
        }
    
        private String readContent(Response response){
            if (response == null ) {
                return "";
            }
    
            try {
                return response.peekBody(Long.MAX_VALUE).string();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "";
        }
    
        private String readContent(RequestBody body){
            if (body == null ) {
                return "";
            }
    
            Buffer buffer = new Buffer();
    
            try {
                //小于2m
                if (body.contentLength() <= 2* 1024*1024) {
                    body.writeTo(buffer);
                } else {
                    return "content is more than 2M";
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return buffer.readUtf8();
        }
    }
    
    展开全文
  • okHttp详细日志打印

    万次阅读 2018-07-11 23:52:20
    okHttp详细日志打印 本文简单介绍下使用okHttp后如何打印详细日志的简单完成。 我们使用okHttp、Retrofit来请求网络都是okHttp的基础类来进行网络请求的。 OkHttp也提供了一个网络拦截器okhttp-logging-...

    okHttp详细日志打印

    本文简单介绍下使用okHttp后如何打印详细日志的简单完成。

    我们使用okHttp、Retrofit来请求网络都是okHttp的基础类来进行网络请求的。

    OkHttp也提供了一个网络拦截器okhttp-logging-interceptor,

    通过它能拦截okhttp网络请求和响应所有相关信息(请求行、请求头、请求体、响应行、响应行、响应头、响应体)。

    OkHttp的官网地址:https://github.com/square/okhttp

    下面是使用日志拦截的过程:

    一.依赖拦截日志地址

    compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
    

    大家如果不能依赖,可以用我后面Demo下的jar包,由于公司环境原因,我是很多依赖不能使用的!

    二.定义拦截器中的网络日志工具

    依赖拦截日志地址,后就能识别HttpLoggingInterceptor。

    之后定义一个要打印日志的类。

    
    public class HttpLogger implements HttpLoggingInterceptor.Logger {
            @Override
            public void log(String message) {
                Log.d("HttpLogInfo", message);//okHttp的详细日志会打印出来
            }
        }
    

    三.创建日志对象,并且放到okHttp请求对象中

        HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor(new HttpLogger());//创建拦截对象
    
            logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);//这一句一定要记得写,否则没有数据输出
    
        //网络请求对象
            OkHttpClient client = new OkHttpClient.Builder()
                    .sslSocketFactory(createSSLSocketFactory())
                    .hostnameVerifier(new TrustAllHostnameVerifier())
                    .connectionPool(new ConnectionPool(8, 10, TimeUnit.MINUTES))
                    .readTimeout(600, TimeUnit.SECONDS)
                    .addNetworkInterceptor(logInterceptor)  //设置打印拦截日志
    //                .addInterceptor(new LogInterceptor())  //自定义的拦截日志,拦截简单东西用,后面会有介绍 
                    .build();
    
    

    下面是拦截自己Post请求的一个示例日志:

    1

    可以看到里面打印了很多详细的信息,比如请求地址,请求方式,请求头,返回的数据内容等等。

    这里提供一下我运行demo的代码,里面有三个目前最新的jar包:okhttp、okio、logging-interceptor

    示例代码有get、post的请求示例,还有一段跳过SSL证书校验的代码。

    地址:https://download.csdn.net/download/wenzhi20102321/10536033

    其他:

    这里说一下其实简单日志拦截是可以自己写的,代码不多。

    后面看了下logging-interceptor-xx.jar这个jar包里面其实就是一个类!代码有三百多行。

    如果不想导入拦截日志的jar包可以复制okHttp项目中这个类的的代码进入项目就可以实现日志拦截了。

    https://github.com/square/okhttp/blob/master/okhttp-logging-interceptor/src/main/java/okhttp3/logging/HttpLoggingInterceptor.java

    这里给大家分享一个简单的日志拦截的代码类LogInterceptor :

    package com.liwenzhi.okhttp.okhttp;
    
    import android.util.Log;
    
    import java.io.IOException;
    
    import okhttp3.FormBody;
    import okhttp3.Interceptor;
    import okhttp3.Request;
    
    /**
     *  日志拦截
     */
    
    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();
        }
    }
    
    

    这个类会打印一些请求的方法头和返回的数据,还有请求使用的时间。并且这个类是不需要依赖的。

    这个类的使用在上面使用步骤第三步有介绍(注释的部分)。

    这个工具类打印出来的日志简单明了。在上面那个图片中也有这个简单工具类的打印start—>end

    共勉:生命中有些东西是值得用一生去珍惜爱护的。

    展开全文
  • OkHttp日志拦截器打印

    2018-12-21 08:07:02
    public class LogInterceptor implements Interceptor { public static String TAG = &amp;amp;quot;LogInterceptor&amp;amp;quot;... public Response intercept(Interceptor.Chain chain) throws ...
    public class LogInterceptor implements Interceptor {
        public static String TAG = "LogInterceptor";
        @Override
        public Response intercept(Interceptor.Chain chain) throws IOException {
            Request request = chain.request();
            long startTime = System.currentTimeMillis();
            Response response = chain.proceed(chain.request());
            long endTime = System.currentTimeMillis();
            long duration=endTime-startTime;
            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(ResponseBody.create(mediaType, content))
                    .build();
        }
    
    }
    
    

    公共参数

    /**
     * author: 17826
     * created on: 2018/12/05 14:30
     * description: 自定义拦截器,用于封装公用参数
     */
    public class MyInterceptor implements Interceptor {
    
        @NonNull
        @Override
        public Response intercept(@NonNull Chain chain) throws IOException {
    
            //获取原始的Request请求
            Request request = chain.request();
    
            SharedPreferences sharedPreferences = FrescoApplication.mContext.getSharedPreferences("kk", 0);
            String userId = sharedPreferences.getString("userId", "");
            String sessionId = sharedPreferences.getString("sessionId", "");
    
            //如果有一个为空,不用添加请求头
            if (TextUtils.isEmpty(userId) || TextUtils.isEmpty(sessionId)) {
                return chain.proceed(request);
            }
    
            Request build = request.newBuilder()
                    .addHeader("userId", userId)
                    .addHeader("sessionId", sessionId)
                    .build();
            return chain.proceed(build);
    
            /*//获取请求方法
            String method = request.method();
    
            *//* 不用method.equals("GET")的原因:
             * method有可能为null,会造成的空指针异常 *//*
            //判断请求的类型
            if ("GET".equals(method)) {
                HttpUrl httpUrl = request.url()
                        .newBuilder()
                        .addQueryParameter(PARAMETER_NAME, PARAMETER_VALUE)
                        .build();
                //获取添加公共参数之后的Request对象
                request = new Request.Builder().url(httpUrl)
                        .build();
            } else if ("POST".equals(method)) {
                RequestBody body = request.body();
    
                if (body instanceof FormBody) {
                    FormBody.Builder builder = new FormBody.Builder();
    
                    //获取原来Request中的参数
                    FormBody originalFormBody = (FormBody)body;
                    //遍历添加到新FormBody中
                    for (int i = 0; i < originalFormBody.size(); i++) {
                        builder.add(originalFormBody.name(i), originalFormBody.value(i));
                    }
                    //添加公共参数
                    builder.add(PARAMETER_NAME, PARAMETER_VALUE);
                    FormBody formBody = builder.build();
    
                    //获取添加公共参数之后的Request对象
                    request = request.newBuilder()
                            .post(formBody)
                            .build();
                }
            }
            //发送拼接完后的请求
            return chain.proceed(request);*/
        }
    
    }
    
    
    展开全文
  • 昨天在网上找了一圈,发现要打印日志,大部分的帖子都是引入OkHttp3的日志库。 implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1' 2、通过OkHttp3 对日志和其他网络请求参数进...
  • 这里写自定义目录标题Android 开发之Okhttp 网络请求日志打印OkHTTP网络日志打印 Android 开发之Okhttp 网络请求日志打印 网络请求是开发的日常工作内容之一,网络日志打印也有很多要注意及优化的部分,本文分享我在...
  • Okhttp中自带的日志拦截器 HttpLoggingInterceptor 实在是不好用,日志太多太乱,所以想要有好看、简洁的日志打印就要靠自定义了,下面分享我参照 HttpLoggingInterceptor 写的自定义日志打印拦截器,分为java版本和...
  • OKHttp日志拦截器

    2018-11-18 19:44:42
    一.依赖拦截日志地址 compile 'com.squareup.okhttp3:logging-interceptor:3.5.0' 二.定义拦截器中的网络日志工具 ...之后定义一个要打印日志的类。 public class HttpLogger implements HttpLoggingIntercept...
  • okhttp日志拦截器LoggingInterceptor

    万次阅读 2016-12-07 13:35:08
    okhttp的用法,就不在此累述了,今天给大家分享一下给okhttp添加日志拦截,打印的方法。先上代码:public class LoggingInterceptor implements Interceptor { @Override public Response inter
  • Android Okhttp3 设置日志打印拦截器

    千次阅读 2019-01-23 16:01:33
    Android Okhttp3 设置日志打印拦截器 方式1 /** * Created by x-sir on 2018/8/3 :) * Function:LoggerInterceptor */ public class LoggerInterceptor implements Interceptor { private static String TAG = ...
  • okhttp 日志拦截器Logging-interceptor

    千次阅读 2017-03-20 16:58:00
    okhttp是目前使用及其...okhttp的用法,就不在此累述了,今天给大家分享一下给okhttp添加日志拦截,打印的方法。 先上代码: public class LoggingInterceptor implements Interceptor { @Override public Respons
  • 现在应该有许多人都是使用okhttp来作为项目的网络请求的底层库,那么,还有人在沿用着对每个请求在执行前后手动打印一下参数及地址这种古老的日志打印方式吗?okhttp的灵活而强大的特点之一,就是其提供了一个拦截器...
  • Retrofit2.0 或OKHttp 日志log

    千次阅读 2016-07-02 17:56:32
    Retrofit2.0 怎么打印请求到的json字符串和查看log呢?  关键类:HttpLoggingInterceptor  关键代码: HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor...
  • android OKHttp日志拦截

    千次阅读 2018-06-28 21:01:13
    OkHttp的日志拦截通过HttpLoggingInterceptor对象进行拦截,该对象并不存在...compile 'com.squareup.okhttp3:logging-interceptor:3.6.0' 创建 HttpLoggingInterceptor对象,进行日志打印HttpLoggingInterce...
  • 在开发中,使用okhttp起websocket,打印日志中无法打印traceId和spanId,导致生产问题无法排查 OkHttpClient client = new OkHttpClient.Builder().build(); client.newWebSocket(request, new WebSocketListener() ...
  • 在网络请求的时候我们一般会打印日志,包含请求地址、请求参数、返回结果、请求耗时等。在之前的操作中,可能会,在Request执行的时候打印一下,Response返回结果的时候打印一下。那么这样在如果同时多个请求的情况...
  •  private Handler handler = OkHttp3Utils.getInstance().getHandler();  //主线程处理  public abstract void onUi(List<T> list);  //主线程处理  public abstract void onFailed(Call call, ...
  • 先写出日志打印类public class LoggingInterceptor implements Interceptor { @Override public Response intercept(Interceptor.Chain chain) throws IOException { //这个chain里面包含了request和response,...
  • 我们公司在项目中使用的网络请求工具是Retrofit,底层封装的是OkHttp,通常调试网络接口时都会将网络请求和响应相关数据通过日志的形式打印出来。OkHttp也提供了一个网络拦截器okhttp-logging-interceptor,通过它能...
  • 最近项目中使用的网络请求工具是Retrofit,底层封装的是OkHttp,通常调试网络接口时都会将网络请求和响应相关数据通过日志的形式打印出来。OkHttp也提供了一个网络拦截器okhttp-logging-interceptor,通过它能拦截...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,857
精华内容 1,542
关键字:

okhttp日志打印