改造2.0如何打印完整的json响应?

2022-08-31 21:19:24

我正在从Volley迁移到Retrofit目前的2.0版本。

如何打印完整的json响应代码?

包括

compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'

RestClient

OkHttpClient client = new OkHttpClient();
        client.interceptors().add(new Interceptor() {
            @Override
            public Response intercept(Interceptor.Chain chain) throws IOException {
                Response response = chain.proceed(chain.request());                
                return response;
            }
        });


        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'")
                .create();


        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(ROOT)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(client)
                .build();

        REST_CLIENT = retrofit.create(APIService.class);

接口服务

   @GET("my/json")
    Call<Model> getFeed();

在活动中 - 调用 API

Call<Model> call = RestClient.get().getFeed();
call.enqueue(new Callback<Model>() {
    @Override
    public void onResponse(Response<Model> response, Retrofit retrofit) {

        Log.w("2.0 getFeed > response.raw() => ", response.raw().toString());//DONT WORK
        Log.w("2.0 getFeed > retrofit => ", retrofit.toString());//DONT WORK
        Log.w("2.0 getFeed > body => ", response.body().toString()); //DONT WORK
        Log.w("2.0 getFeed > getStatus => ", response.body().getStatus());

    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
        Log.e("2.0 getFeed > onFailure => ", t.toString());
    }
});

答案 1

要以 json 格式打印完整响应,请执行以下操作:

Log.w("2.0 getFeed > Full json res wrapped in gson => ",new Gson().toJson(response));

如果你想有漂亮的打印功能,使用:

Log.w("2.0 getFeed > Full json res wrapped in pretty printed gson => ",new GsonBuilder().setPrettyPrinting().create().toJson(response));

请注意,这将打印反序列化的数据(而不是从服务器返回的原始响应)。要获取原始响应,您可以使用以下方法之一:

  1. 使用请参阅:https://stackoverflow.com/a/33256827/2267723 或拥有自己的拦截器版本HttpLoggingInterceptor
  2. 使用 http 调试工具,例如 .请参见:http://facebook.github.io/stetho/ 或 .请参见: https://www.charlesproxy.comStethoCharles Web Debugging Proxy

答案 2

实际上Square已经为此创建了一个类,只需添加

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor).build();

而且,在改造中

Retrofit retrofit = new Retrofit.Builder()
            .client(client)               
            .baseUrl("https://yourapi.com/api/")
            .build();

拦截器类位于 maven 中心

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

您可以在 HttpLoggingInterceptor 类中设置日志记录级别。BODY 是详细级别(它将所有内容打印到 Body)。更多信息可以在OkHttp github上找到

谨慎!

不要忘记在生产中删除拦截器(或将日志记录级别更改为 NONE)!否则,人们将能够在Log Cat上看到您的请求和响应。


推荐