web-dev-qa-db-fra.com

Comment déboguer mon appel d'API Retrofit?

J'utilise retrofit pour obtenir des données de l'API Flickr. La méthode dans laquelle je fais l'appel ressemble à ceci:

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 n'entre jamais dans la méthode onResponse(). La première instruction log dans onResponse() ne s'imprime jamais, pas plus que l'instruction log dans onFailure(). Lorsque j'essaie d'entrer l'URL renvoyée par call.request().url().toString() dans le navigateur, cela fonctionne très bien et j'obtiens le JSON attendu. Pourquoi ma méthode enqueue() ne se déclenche-t-elle jamais?

Merci pour toute aide!

24
intA

Utilisez HttpLoggingInterceptor avec Retrofit.

Si cela vous aide, ajoutez ceci dans votre build.gradle -

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

À l'intérieur de votre APIClient class Ajoute ça -

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 pourrez enregistrer les appels du réseau de mise à niveau que vous effectuez.

Faites-moi savoir si vous avez besoin de plus d'informations.

34
hsm59

Un intercepteur OkHttp qui enregistre les données de demande et de réponse HTTP.

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

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

Il y a 4 niveaux: AUCUN, BASIQUE, EN-TÊTES, CORPS

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

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

Depuis Gradle

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

Suivez ceci référence

EDITED: J'ai également trouvé cette bibliothèque qui a une structure très agréable et un journal propre. Essayez-le !!

14
nhp