Retrofit2打印 网络请求日志

8 篇文章 0 订阅
3 篇文章 0 订阅

在使用Retrofit时,如果我们需要打印网络请求的日志(诸如请求地址,参数,耗时,请求返回结果),

一、我可以使用现有的日志库,如下:

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

在使用时,添加如下代码:

//声明日志类
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
//设定日志级别
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

//自定义OkHttpClient
OkHttpClient.Builder okHttpClient = new OkHttpClient.Builder();
//添加拦截器
okHttpClient.addInterceptor(httpLoggingInterceptor);

//创建并指定自定义的OkHttpClient
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://ip.taobao.com").addConverterFactory(GsonConverterFactory.create()).client(okHttpClient.build()).build();

//创建接口服务类
TaoBaoApiService taoBaoApiService = retrofit.create(TaoBaoApiService.class);

这样在我们的网络请求中便会有如下日志打印。

六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: --> GET http://ip.taobao.com/service/getIpInfo.php?ip=220.248.17.90 http/1.1
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: --> END GET
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: <-- 200 OK http://ip.taobao.com/service/getIpInfo.php?ip=220.248.17.90 (36ms)
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: Server: Tengine
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: Date: Fri, 24 Jun 2016 07:31:03 GMT
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: Content-Type: text/html
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: Transfer-Encoding: chunked
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: Connection: keep-alive
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: Vary: Accept-Encoding
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: X-Powered-By: PHP/5.4.31
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: 
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: {"code":0,"data":{"country":"\u4e2d\u56fd","country_id":"CN","area":"\u534e\u4e1c","area_id":"300000","region":"\u4e0a\u6d77\u5e02","region_id":"310000","city":"\u4e0a\u6d77\u5e02","city_id":"310100","county":"","county_id":"-1","isp":"\u8054\u901a","isp_id":"100026","ip":"220.248.17.90"}}
六月 24, 2016 3:31:04 下午 okhttp3.internal.Platform log
信息: <-- END HTTP (290-byte body)

二、自定义日志打印处理

如果打印的数据不符合要求,我们自定义打印信息的内容和格式

这里我们使用一个自定的,具体代码大致如下:

okHttpClient.addInterceptor(new Interceptor() {
    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        //获得请求信息,此处如有需要可以添加headers信息
        Request request = chain.request();
        //添加Cookie信息
        request.newBuilder().addHeader("Cookie","aaaa");
        //打印请求信息
        syso("url:" + request.url());
        syso("method:" + request.method());
        syso("request-body:" + request.body());

        //记录请求耗时
        long startNs = System.nanoTime();
        okhttp3.Response response;
        try {
            //发送请求,获得相应,
            response = chain.proceed(request);
        } catch (Exception e) {
            throw e;
        }
        long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
        //打印请求耗时
        syso("耗时:"+tookMs+"ms");
        //使用response获得headers(),可以更新本地Cookie。
        syso("headers==========");
        Headers headers = response.headers();
        syso(headers.toString());

        //获得返回的body,注意此处不要使用responseBody.string()获取返回数据,原因在于这个方法会消耗返回结果的数据(buffer)
        ResponseBody responseBody = response.body();

        //为了不消耗buffer,我们这里使用source先获得buffer对象,然后clone()后使用
        BufferedSource source = responseBody.source();
        source.request(Long.MAX_VALUE); // Buffer the entire body.
        //获得返回的数据
        Buffer buffer = source.buffer();
        //使用前clone()下,避免直接消耗
        syso("response:" + buffer.clone().readString(Charset.forName("UTF-8")));
        return response;
    }
});

代码说明已添加注释。需要额外说明一点就是syso函数只是做简单打印,如下:

private static void syso(String msg) {
    System.out.println(msg);
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Retrofit2进行POST异步请求的示例代码: 1.首先,在build.gradle文件中添加Retrofit2和Gson的依赖: ```gradle dependencies { // Retrofit2 implementation 'com.squareup.retrofit2:retrofit:2.9.0' 'com.squareup.retrofit2:converter-gson:2.9.0' // Gson implementation 'com.google.code.gson:gson:2.8.6' } ``` 2.创建一个接口,用于定义POST请求的URL和参数: ```java public interface PostRequest_Interface { @POST("translate?doctype=json&jsonversion=&type=&keyfrom=&model=&mid=&imei=&vendor=&screen=&ssid=&network=&abtest=") @FormUrlEncoded Call<Translation1> getCall(@Field("i") String targetSentence); } ``` 3.创建一个实体类,用于接收服务器返回的JSON数据: ```java public class Translation1 { private int errorCode; private String query; private List<String> translation; // 省略getter和setter方法 } ``` 4.在Activity中发起POST异步请求: ```java public class MainActivity extends AppCompatActivity { private TextView mTvResult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTvResult = findViewById(R.id.tv_result); // 创建Retrofit对象 Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://fanyi.youdao.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); // 创建网络请求接口实例 PostRequest_Interface request = retrofit.create(PostRequest_Interface.class); // 发起POST异步请求 Call<Translation1> call = request.getCall("hello"); call.enqueue(new Callback<Translation1>() { @Override public void onResponse(Call<Translation1> call, Response<Translation1> response) { Translation1 translation = response.body(); if (translation != null) { mTvResult.setText(translation.getTranslation().get(0)); } } @Override public void onFailure(Call<Translation1> call, Throwable t) { mTvResult.setText("请求失败:" + t.getMessage()); } }); } } ``` 在上述代码中,我们首先创建了一个Retrofit对象,并指定了请求的基础URL和Gson转换器。然后,我们创建了一个网络请求接口实例,并调用其中的getCall()方法发起POST异步请求。最后,我们在回调方法中处理服务器返回的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值