2017-08-12 16 views
10

私はFlickr APIからデータを取得するためにretrofitを使用しています。それはonResponse()方法に入ることはありませんがレトロフィットAPIコールをデバッグするにはどうすればよいですか?

public static List<String> getImageIds(int size) { 
    Call<PhotosList> call = flickrService.getPhotos(apiKey, format, "1"); 
    Log.d("TEMP_TAG", "photo url: " + call.request().url().toString()); 
    photoIds = new ArrayList<String>(); 

    call.enqueue(new Callback<PhotosList>(){ 
     @Override 
     public void onResponse(Call<PhotosList> call, Response<PhotosList> response) { 
      Log.d("TEMP_TAG", "it's getting here"); 
      PhotosList photosList = response.body(); 
      List<Photo> photos = photosList.getPhotos().getPhoto(); 

      for(Photo photo : photos) { 
       Log.d("TEMP_TAG", "adding photo id to list: " + photo.getId()); 
       photoIds.add(photo.getId()); 
      } 
     } 

     @Override 
     public void onFailure(Call<PhotosList> call, Throwable t) { 
      // TODO: Clean up 
      Log.d("TEMP_TAG", "photoId: "); 
     } 
    }); 
    Log.d("TEMP_TAG", "it's getting here too"); 
    return photoIds; 
} 

:メソッドは、私はこのようなルックスで通話を作ってるんです。 onResponse()内の最初のログステートメントは決して印刷されず、onFailure()のログステートメントも印刷されません。ブラウザでcall.request().url().toString()によって返されたURLを入力しようとすると正常に動作し、期待されるJSONを取得します。私のenqueue()メソッドが決して発射されないのはなぜですか?

ありがとうございました!

+1

に従ってください。そのようにして、あなたはあなたが送ったもの、そして元のフォーマットで受け取ったものを見ることができます。 – TooManyEduardos

+0

また、ログ 'Log.d(" TEMP_TAG "、" photo url: "+ call.request()。url()。toString());を削除し、動作しているかどうかを調べる(call.request – TooManyEduardos

答えて

13

HttpLoggingInterceptorとRetrofitを使用してください。

このことができます場合は、お使いのbuild.gradle内にこれを追加 -

public class ApiClient { 
    private static Retrofit retrofit = null; 

    public static Retrofit getClient(){ 

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


     if(retrofit==null){ 
      retrofit = new Retrofit.Builder() 
        .baseUrl(BuildConfig.baseUrl) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .client(client) 
        .build(); 
     } 
     return retrofit; 
    } 
} 

Kotlinコード

val interceptor : HttpLoggingInterceptor = HttpLoggingInterceptor().apply { 
      this.level = HttpLoggingInterceptor.Level.BODY 
     } 

val client : OkHttpClient = OkHttpClient.Builder().apply { 
      this.addInterceptor(interceptor) 
     }.build() 


fun getService(): Service { 
     return Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .addCallAdapterFactory(LiveDataCallAdapterFactory()) 
       .client(client) 
       .build() 
       .create(Service::class.java) 
    } 

そして、あなたがする - あなたのAPIClient classこれを追加インサイド

//Retrofit and OkHttp for Networking 
compile 'com.squareup.retrofit2:retrofit:2.3.0' 
compile 'com.squareup.retrofit2:converter-gson:2.3.0' 
//Logging Network Calls 
compile 'com.squareup.okhttp3:logging-interceptor:3.6.0' 

をRetrofit Networkコールをログに記録できるようにするあなたが作ること。

詳細情報が必要な場合はお知らせください。

8

HTTP要求と応答データを記録するOkHttpインターセプタ。

HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
logging.setLevel(Level.BASIC); 
OkHttpClient client = new OkHttpClient.Builder() 
    .addInterceptor(logging) 
    .build(); 

あなたはsetLevelを呼び出すことにより、任意の時点でログレベルを変更することができます。

4つのレベルがある:NONE、BASIC、ヘッダ、BODY

コンストラクタにLoggerインスタンスを渡し、カスタムの場所にログインするには。

HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new 
Logger() { 
@Override public void log(String message) { 
    Log.d(TAG, "message: "); 
    } 
}); 

のGradle

から
compile 'com.squareup.okhttp3:logging-interceptor:(insert latest version)' 

は、これが本当の答えをイマイチが、新しいネットワーク呼び出しをテストするときに私の個人的な提案は常にチャールズやポストマンのようなものを使用しているこのreference

+0

ええと、これは私のために何もしていないようです。上記のコードを使用し、 'HttpLoggingInterceptor'メソッドを呼び出しても何も出力されません。 – intA

+0

Retrofit#クライアント(クライアント)を使用して、改造のためにクライアントを追加しましたか? –

+0

はい、Retrofitオブジェクトを構築しているチェーンに '.client(クライアント)'を追加しました – intA

関連する問題