2017-08-12 1 views
10

J'utilise retrofit pour obtenir des données de l'API Flickr. La méthode que je fais l'appel ressemble à ceci:Comment puis-je déboguer mon appel API Retrofit?

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; 
} 

Cependant, il est jamais entrer dans la méthode onResponse(). La première instruction de journal au sein de onResponse() n'imprime jamais, pas plus que l'instruction de journal dans onFailure(). Lorsque j'essaie d'entrer l'URL renvoyée par call.request().url().toString() dans le navigateur, cela fonctionne correctement et j'obtiens le JSON attendu. Pourquoi ma méthode enqueue() ne tire-t-elle jamais?

Merci pour toute aide!

+1

Ce nest pas une vraie réponse, mais ma suggestion personnelle est toujours utiliser quelque chose comme Charles ou Postman lors du test de nouveaux appels de réseau. De cette façon, vous pouvez voir ce que vous envoyez, et ce que vous recevez dans leurs formats originaux. – TooManyEduardos

+0

En outre, supprimer le journal 'Log.d (" TEMP_TAG "," photo url: "+ appel.request(). Url(). ToString());' et voir si cela fonctionne (l'élément call.request() pourrait être consommer l'appel avant même que cela arrive) – TooManyEduardos

Répondre

13

Utilisez HttpLoggingInterceptor avec Retrofit.

Si cela aide, ajoutez dans votre build.gradle -

//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' 

l'intérieur de votre APIClient class ajouter cette -

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; 
    } 
} 

code 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) 
    } 

Et vous être en mesure de se connecter à l'appel Retrofit Network s que vous faites. Faites-moi savoir si vous avez besoin de plus d'informations.

8

Un intercepteur OkHttp qui enregistre les requêtes HTTP et les données de réponse.

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

Vous pouvez modifier le niveau de journal à tout moment en appelant setLevel.

Il y a 4 niveaux: NONE, BASIC, TÊTES, CORPS

Pour vous connecter à un emplacement personnalisé, passer une Logger instance au constructeur.

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

De Gradle

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

Suivre ce reference

+0

Hmm, cela ne semble pas faire quelque chose pour moi. Utilise le code ci-dessus et place le 'HttpLoggingInterceptor' dans la méthode qui fait les appels, mais rien ne sort. – intA

+0

Avez-vous ajouté un client pour la rénovation en utilisant ce client (client) Retrofit #? –

+0

Oui, j'ai ajouté le '.client (client)' à la chaîne où je construis mon objet Retrofit – intA