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);
}
});
これは、コンバーターによって既にオブジェクトに変換されているためです。 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で見ることができます。
単に使用:
Log.i("RAW MESSAGE", response.raw().body().string());
または:
Log.i("RAW MESSAGE", response.body().string());
呼び出しでは、okhttp3の「ResponseBody」を使用する必要があります。次に、「response.body()。string()」を取得して、サーバーから提供されたJSONObjectを取得します。これは、モデルオブジェクトに対するサーバーの応答を解析するときにエラーが発生した場合に、エラーをキャッチするのに適した方法です。
デバッグ目的で生の応答本文を確認したいと思います。これを行うには2つの方法があります。
@aldokが述べたようにokhttp3.logging.HttpLoggingInterceptor
を使用します。
応答オブジェクトの一部のプロパティを確認したい場合、または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) {
}
});
これがお役に立てば幸いです〜