web-dev-qa-db-ja.com

retrofit 2.0完全なjson応答を印刷する方法は?

ボレーから現在のバージョン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);

APIService

   @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());
    }
});
36
Joolah

Jsonで完全な応答を印刷するには:

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

pretty print機能が必要な場合は、次を使用します。

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

これにより、デシリアライズされたデータが出力されることに注意してください(サーバーから返されるRaw応答ではありません)。生の応答を取得するには、次のいずれかを使用できます。

  1. HttpLoggingInterceptorを使用してください: https://stackoverflow.com/a/33256827/226772 または独自のインターセプターバージョン
  2. Stethoなどのhttpデバッグツールを使用します。参照: http://facebook.github.io/stetho/ またはCharles Web Debugging Proxy。参照: https://www.charlesproxy.com
51
Maher Abuthraa

このような次のインターセプタークラスをプラグインします。

OkHttpClient client = new OkHttpClient();
        client.interceptors().add(new LoggingInterceptor());

//////インターセプタークラス

public static class LoggingInterceptor implements Interceptor {
        @Override
        public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
            Log.i("LoggingInterceptor","inside intercept callback");
            Request request = chain.request();
            long t1 = System.nanoTime();
            String requestLog = String.format("Sending request %s on %s%n%s",
                    request.url(), chain.connection(), request.headers());
            if(request.method().compareToIgnoreCase("post")==0){
                requestLog ="\n"+requestLog+"\n"+bodyToString(request);
            }
            Log.d("TAG","request"+"\n"+requestLog);
            com.squareup.okhttp.Response response = chain.proceed(request);
            long t2 = System.nanoTime();

            String responseLog = String.format("Received response for %s in %.1fms%n%s",
                    response.request().url(), (t2 - t1) / 1e6d, response.headers());

            String bodyString = response.body().string();

            Log.d("TAG","response only"+"\n"+bodyString);

            Log.d("TAG","response"+"\n"+responseLog+"\n"+bodyString);

            return response.newBuilder()
                    .body(ResponseBody.create(response.body().contentType(), bodyString))
                    .build();

        }


public static String bodyToString(final Request request) {
    try {
        final Request copy = request.newBuilder().build();
        final Buffer buffer = new Buffer();
        copy.body().writeTo(buffer);
        return buffer.readUtf8();
    } catch (final IOException e) {
        return "did not work";
    }
}`

礼儀https://github.com/square/retrofit/issues/1072#

18
DGN

実際、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 Centralにあります

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

HttpLoggingInterceptorクラスでログレベルを設定できます。 BODYは冗長なものです(すべてをBodyに出力します)。詳細情報は OkHttp github で入手できます。

注意!

本番環境でインターセプターを削除する(またはロギングレベルをNONEに変更する)ことを忘れないでください!そうしないと、人々はあなたのリクエストとレスポンスをLog Catで見ることができます。

17
aldok

JSONでretrofit2.3.0の完全な応答を取得するには、以下を使用します。

これは私のために動作します。

call.enqueue(new Callback<someList>() {
        @Override
        public void onResponse(Call<someList> call, Response<someList> response) {
            if (response.isSuccessful())
                Log.e("Success", new Gson().toJson(response.body()));
            else
                Log.e("unSuccess", new Gson().toJson(response.errorBody()));
        }

        @Override
        public void onFailure(Call<someList> call, Throwable t) {
            Log.e("onFailure", t.toString());
        }
    });
4
Dhiren

これを試して !!

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

    /** Handles Log */
    retrofit.client().interceptors().add(new LoggingInterceptor());

    mRestClient = retrofit.create(RestServices.class);





class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
    Request request = chain.request();

    long t1 = System.nanoTime();
    Logger.d(String.format("Sending request %s on %s%n%s",
            request.url(), chain.connection(), request.headers()));

    Response response = chain.proceed(request);

    long t2 = System.nanoTime();
    Logger.d(String.format("Received response for %s in %.1fms%n%s",
            response.request().url(), (t2 - t1) / 1e6d, response.headers()));


    final String responseString = new String(response.body().bytes());

    Logger.d("Response: " + responseString);

    return  response.newBuilder()
            .body(ResponseBody.create(response.body().contentType(), responseString))
            .build();
}

このデモをチェック!!!

3
sreekumar

以下のようにsetLogLevelアダプターにRetrofitし、ヘッダーとレスポンスコードとレスポンスなどのレスポンスとその他のデータを確認できます。

setLogLevel(LogLevel.FULL)

Retrofitバージョン2+を使用している場合、ログを表示するにはOkHttpLoggingInterceptorを設定する必要があります。

最初にOkHttpLoggingInterceptorをプロジェクトに追加します。

com.squareup.okhttp3:logging-interceptor:${Versions.okHttpLoggingInterceptorVersion}

そして、インターセプターを初期化するよりも:

HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY }

最後に、OkHttpClientに追加します

with(OkHttpClient.Builder()) {
            if (BuildConfig.DEBUG) addInterceptor(loggingInterceptor)
            build()
        }
1
savepopulation
Log.e("TAG","2.0 getFeed > response.raw() => " +  new Gson().toJson(response.body()));
1
Manav Isarani

これを試して :

 Log.d("LOG","RESPONSE ==="+response.raw().toString());
0
Saurabh Mistry

Okhttp3.loggingパッケージを見てください。彼らはすでにあなたのニーズに使用できるHttpLoggingInterceptorを持っています。また、それらに応じて、ログレベルを指定することもできます。

前述のように、リクエストにこのインターセプターを含めることができます-OkHttpClient.Builderを介して:

public OkHttpClient provideOkHttpClient() {
    final OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
    okHttpBuilder.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));
    return okHttpBuilder.build();
}
0
Anton Kogan
public class HttpLoggingInterceptor {
    HttpLoggingInterceptor provideHttpLoggingInterceptor(){
        return new HttpLoggingInterceptor(message ->
                Log.d("TAG", message)).setLevel(HttpLoggingInterceptor.Level.BODY);
    }
}


public class OkHttpClient {
    OkHttpClient provideOkHttpClient(@NonNull HttpLoggingInterceptor interceptor){
        return new OkHttpClient.Builder()
               .addInterceptor(interceptor)
               .build();
    }  
}