11

我的改造设置HttpLoggingInterceptor如下:

Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
                .setPrettyPrinting() // Pretty print
                .create();

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

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

在我的 Gson 实例上,我做到了setPrettyPrinting,我仍然得到紧凑的 JSON 输出。这是我的图书馆。

compile 'com.google.code.gson:gson:2.5'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.okhttp3:okhttp:3.0.1'

如何使用 Retrofit 2 获得漂亮的打印效果?谢谢。

编辑:更新了我的库,但仍然没有工作

4

5 回答 5

10

受 Tanapruk 回答的启发,我所做的就是让它与我的改造版本(2.1.0)和 okhttp.logging-interceptor(3.8.1)一起工作。

此版本适用于打印 JSON 对象和数组。

class ApiLogger : HttpLoggingInterceptor.Logger {
    override fun log(message: String) {
        val logName = "ApiLogger"
        if (message.startsWith("{") || message.startsWith("[")) {
            try {
                val prettyPrintJson = GsonBuilder().setPrettyPrinting()
                    .create().toJson(JsonParser().parse(message))
                Log.d(logName, prettyPrintJson)
            } catch (m: JsonSyntaxException) {
                Log.d(logName, message)
            }
        } else {
            Log.d(logName, message)
            return
        }
    }
}

在客户端:

val httpClientBuilder = OkHttpClient.Builder()
val httpLoggingInterceptor = HttpLoggingInterceptor(ApiLogger())
httpLoggingInterceptor.level = Level.BODY
httpClientBuilder.addInterceptor(httpLoggingInterceptor)
于 2017-07-19T14:20:10.220 回答
5

创建您自己的自定义 HttpLogginInterceptor。

public class CustomHttpLogging implements HttpLoggingInterceptor.Logger {
    @Override
    public void log(String message) {
        final String logName = "OkHttp";
        if (!message.startsWith("{")) {
            Log.d(logName, message);
            return;
        }
        try {
            String prettyPrintJson = new GsonBuilder().setPrettyPrinting().create().toJson(new JsonParser().parse(message));
            Log.d(logName, prettyPrintJson);
        } catch (JsonSyntaxException m) {
            Log.d(logName, message);
        }
    }
}

在您的客户端中,添加:

OkHttpClient client = new OkHttpClient.Builder()
            .addNetworkInterceptor(new CustomHttpLogging())
            .build();
于 2016-08-22T08:15:58.833 回答
1

感谢 Tanapruk Tangphianphan 的回答。

我改进它以支持所有人,Java Platform而不仅仅是Android.

创建 PrettyLogger 类

class PrettyLogger implements HttpLoggingInterceptor.Logger {
    private Gson mGson = new GsonBuilder().setPrettyPrinting().create();
    private JsonParser mJsonParser = new JsonParser();

    @Override
    public void log(String message) {
        String trimMessage = message.trim();
        if ((trimMessage.startsWith("{") && trimMessage.endsWith("}"))
                || (trimMessage.startsWith("[") && trimMessage.endsWith("]"))) {
            try {
                String prettyJson = mGson.toJson(mJsonParser.parse(message));
                Platform.get().log(INFO, prettyJson, null);
            } catch (Exception e) {
                Platform.get().log(WARN, message, e);
            }
        } else {
            Platform.get().log(INFO, message, null);
        }
    }
}

在构建器中使用:

OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new PrettyLogger());
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(loggingInterceptor);
于 2019-09-29T00:53:15.590 回答
0

不使用 gson 的 Kotlin 版本:

HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger {

    private fun print(m: String) {
        //Crashlytics.log(m)
        Log.i("API", m)
    }

    override fun log(message: String) {
        if (message.length > 500)
            return print("=== more than 500 characters ===")

        if (message.startsWith("{") || message.startsWith("[")) try {
                JSONObject(message).toString(4).also(::print)
            } catch (e: JSONException) { print(message) }
        else print(message)
    }
}).also { it.level = HttpLoggingInterceptor.Level.BODY }
于 2020-01-09T09:20:24.860 回答
0

Beta 2 并不总是尊重自定义 gson 设置。尝试升级到 Beta 3。

来自beta 3 变更日志——

修复:Gson 转换器现在尊重提供的 Gson 实例上的设置(例如 serializeNulls)。这需要 Gson 2.4 或更高版本。

您还需要为 beta3 升级到 okhttp3。

于 2016-01-29T16:20:20.303 回答