web-dev-qa-db-fra.com

Obtenez une réponse HTTP brute avec Retrofit

Je souhaite obtenir la réponse http brute de mon API REST. J'ai essayé avec cette interface:

@POST("/login")
@FormUrlEncoded
Call<retrofit.Response> login(@Field("username") String login, @Field("password") String pass,
                     @Field("appName") String appName, @Field("appKey") String appKey);

Mais je reçois:

Java.lang.IllegalArgumentException: impossible de créer un adaptateur d'appel pour retrofit.Call pour la méthode Api.login

Je crée Retrofit de cette façon:

Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
retrofitBuilder.addConverterFactory(JacksonConverterFactory.create());
Retrofit retrofitAdapter = retrofitBuilder.baseUrl(baseUrl).build();
return retrofitAdapter.create(apiClass);
37
Héctor

Pour accéder à la réponse brute, utilisez ResponseBody from okhttp comme type d'appel. 

Call<ResponseBody> login(...)

Dans votre rappel, vous pouvez vérifier le code de réponse avec la méthode code de la réponse. Ceci s’applique à tout type de retour Rénovation 2, car votre callback obtient toujours une Response paramétrée avec votre type de retour actuel. Pour asynchrone - 

Call<ResponseBody> myCall = myApi.login(...)
myCall.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
        // access response code with response.code()
        // access string of the response with response.body().string()
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
});

pour les appels synchrones - 

Response<ResponseBody> response = myCall.execute();
System.out.println("response code" + response.code());
62
iagreen

Vous pouvez obtenir des informations sur les en-têtes, le code de réponse et le corps de la réponse json brute en utilisant Interceptors . Vous pouvez écrire vos intercepteurs personnalisés, mais je préfère utiliser le propre intercepteur de journalisation de Square. Il est disponible sur maven central.

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

Voici comment l'utiliser

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

Le niveau de journalisation BODY imprimera des en-têtes sur la réponse body. Et dans votre rénovation

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

Maintenant, ouvrez Log Cat et vous verrez la réponse HTTP brute.

Mise en garde!

N'oubliez pas de supprimer les intercepteurs (ou de modifier le niveau de journalisation sur NONE) en production! Sinon, votre demande et votre réponse pourront être consultées sur Log Cat.

25
aldok

J'ai eu le même problème mais une solution différente. J'ai pris la demande et l'envoyer avec OkHttp3Client. Comme ça:

//raw text 
Request request = call.clone().request();
OkHttpClient client = new OkHttpClient();
okhttp3.Response test = client.newCall(request).execute();
System.out.println(test.body().string());

source: http://robinhenniges.com/de/retrofit-2-raw-response

0
Rob Anderson