web-dev-qa-db-ja.com

Retrofit 2.0を使用して生の応答と要求を取得する方法

Retrofit2.0.2を使用して生の応答を取得しようとしています。

これまでのところ、次のコード行を使用して応答を印刷しようとしましたが、正確な応答本文ではなくアドレスが出力されました。

Log.i( "RAW MESSAGE"、response.body()。toString());

compile 'com.squareup.retrofit2:retrofit:2.0.2'

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


            GitApi gitApi = retrofit.create(GitApi.class);

            Call<Addresses> call = gitApi.getFeed(user);

    call.enqueue(new Callback<Addresses>() {

                @Override
                public void onResponse(Response<Addresses> response, Retrofit retrofit) {
                    try {
                        mDisplayDetails.setText(response.body().getSuburbs().get(0).getText());

                    **Log.i("RAW MESSAGE",response.body().toString());**

                    } catch (Exception e) {
                        mDisplayDetails.setText(e.getMessage());
                    }
                    mProgressBar.setVisibility(View.INVISIBLE);

                }

                @Override
                public void onFailure(Throwable t) {
                    mDisplayDetails.setText(t.getMessage());
                    mProgressBar.setVisibility(View.INVISIBLE);

                }
            });
18
praveen kumar

これは、コンバーターによって既にオブジェクトに変換されているためです。 raw jsonを取得するには、Httpクライアントにインターセプターが必要です。ありがたいことに、独自のクラスを作成する必要はありません。SquareはすでにHttpLoggingInterceptorクラスを提供しています。

これをアプリレベルのGradleに追加します

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

そして、あなたのOkHttpClientでそれを使用してください

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

RetrofitでHttpClientを変更することを忘れないでください。

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

Log Catに生のjson応答が表示されます。詳細については、Squareの OkHttp github を参照してください。

注意!

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

10
aldok

単に使用:

Log.i("RAW MESSAGE", response.raw().body().string());

または:

Log.i("RAW MESSAGE", response.body().string());
2
Kevin Robatel

呼び出しでは、okhttp3の「ResponseBody」を使用する必要があります。次に、「response.body()。string()」を取得して、サーバーから提供されたJSONObjectを取得します。これは、モデルオブジェクトに対するサーバーの応答を解析するときにエラーが発生した場合に、エラーをキャッチするのに適した方法です。

2
oskarko

デバッグ目的で生の応答本文を確認したいと思います。これを行うには2つの方法があります。

  1. @aldokが述べたようにokhttp3.logging.HttpLoggingInterceptorを使用します。

  2. 応答オブジェクトの一部のプロパティを確認したい場合、またはjson(response body)を手動でPOJOに変換したい場合は、次のようにすることができます。

レトロフィットクライアントの初期化中にaddConverterFactoryを使用しないでください。この行をコメント化してください。

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

次に、このような応答を消費します:

Call<ResponseBody> topRatedResponseCall = apiService.getTopRatedMoves(API_KEY);
    topRatedResponseCall.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            try {
                Log.d(LOG_TAG, response.body().string());
                int code = response.code();
                testText.setText(response.body().string());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {

        }
    });

これがお役に立てば幸いです〜

1
yu zhao