web-dev-qa-db-fra.com

Comment obtenir une réponse brute et une demande à l'aide de Retrofit 2.0

J'essaie d'obtenir la réponse brute à l'aide de Retrofit2.0.2. 

Jusqu'ici, j'ai essayé d'imprimer la réponse à l'aide de la ligne de code suivante, mais l'adresse et non le corps de la réponse exacte est imprimée.

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

                }
            });
11
praveen kumar

C'est parce qu'il est déjà converti en objet par convertisseur. Pour obtenir le JSON brut, vous avez besoin d’un intercepteur sur votre client Http. Heureusement, vous n'avez pas besoin d'écrire votre propre classe, Square fournit déjà la classe HttpLoggingInterceptor pour vous.

Ajoutez ceci à votre niveau d'application

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

Et utilisez-le dans votre OkHttpClient

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

N'oubliez pas de changer votre HttpClient dans Retrofit.

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

Dans Log Cat, vous verrez la réponse JSON brute. De plus amples informations sont disponibles sur Square's OkHttp github .

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.

7
aldok

Utilisez simplement:

Log.i("RAW MESSAGE", response.raw().body().string());

Ou:

Log.i("RAW MESSAGE", response.body().string());
3
Kevin Robatel

Vous devez utiliser "ResponseBody" de okhttp3 dans votre appel. Ensuite, obtenez "response.body (). String ()" pour obtenir le JSONObject tel que votre serveur vous le donne . C'est un bon moyen de détecter les erreurs s'il y a des erreurs d'analyse de la réponse du serveur à votre objet modèle.

2
oskarko

Je suppose que vous voulez voir le corps de réponse brut à des fins de débogage. Il y a deux façons de faire ça.

  1. Utiliser okhttp3.logging.HttpLoggingInterceptor comme @aldok mentionné.

  2. Si vous souhaitez vérifier certaines propriétés de l'objet de réponse ou convertir le json (corps de la réponse) en POJO manuellement, vous pouvez le faire comme ceci:

N'utilisez pas addConverterFactory lors de l'initialisation du client de modification, commentez cette ligne.

retrofit = new Retrofit.Builder()
                .client(client)
                .baseUrl(BASE_URL)
                //.addConverterFactory(GsonConverterFactory.create())
                .build();

Puis consommer la réponse comme ceci: 

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) {

        }
    });

J'espère que cela aiderait ~

0
yu zhao