0
votes

Analyser json imbriqué à l'aide de la mise à niveau dans Android

Je reçois une exception de pointeur nul. Je souhaite récupérer une citation aléatoire de cette API Quotes - https://quotes.rest/ pour l'afficher dans mon Android application. Où vais-je mal?

(Je m'excuse si je n'ai pas posé la question correctement ou si je n'ai pas respecté les règles en publiant une question. C'est la première fois que je pose une question)

J'ai créé les POJO nécessaires et essayé de récupérer la citation dans MainActivity.

java.lang.NullPointerException: Attempt to invoke virtual method 'com.platinumstudio.contactsdemo7.network.Contents com.platinumstudio.contactsdemo7.Example.getContents()' on a null object reference
    at     com.platinumstudio.contactsdemo7.MainActivity$3.onResponse(MainActivity.java)

GetDataService

public class RetrofitClientInstance {

private static Retrofit retrofit = null;
private static  final String BASE_URL = "https://quotes.rest";

public static Retrofit getRetrofitInstance(){
    if(retrofit == null){
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}
}

POJO- Citation

public class Example {

@SerializedName("contents")
@Expose
private Contents contents;

public Contents getContents() {
    return contents;
}

public void setContents(Contents contents) {
    this.contents = contents;
}
}

POJO- Contenu

public class Contents {

@SerializedName("quotes")
@Expose
private List<Quote> quotes;


public List<Quote> getQuotes() {
    return quotes;
}

public void setQuotes(List<Quote> quotes) {
    this.quotes = quotes;
}
}

POJO- Exemple

public class Quote {

@SerializedName("quote")
private String quote;

public Quote(String quote) {
    this.quote = quote;
}

public String getQuote() {
    return quote;
}

public void setQuote(String quote) {
    this.quote = quote;
}
}

Classe RetrofitClientInstance

public interface GetDataService {
@GET("/quote/random")
Call<Example> getRandomQuote();
}


5 commentaires

log body () vérifie d'abord quelles données il renvoie


Cela s'est produit parce que votre response.body () peut être null. Pendant que j'essayais d'ouvrir l'URL sur mon navigateur, cela indique un accès non autorisé. C'est peut-être pourquoi votre response.body () est nul. Regarde ça


Vous devez ajouter une clé API à la demande. Si vous êtes abonné et que vous essayez cela depuis une console, ajoutez l'en-tête «X-TheySaidSo-Api-Secret» et ajoutez votre clé API comme valeur d'en-tête. Vous pouvez tester et jouer avec l'API ici même sur cette page Web. Pour utiliser les points de terminaison privés et vous abonner à l'API, veuillez visiter https://theysaidso.com/api.


Passez votre apikey comme en-tête et essayez


Merci à tous pour les réponses. Malheureusement, je viens d'apprendre sur le site Web que je dois payer pour obtenir la clé API. Je pense que je ne continuerai plus avec cette API.


4 Réponses :


0
votes

Je pense que vous devez ajouter une clé Api à votre demande, sinon vous ne serez pas autorisé à accéder aux données. Par conséquent, le corps de votre réponse est nul, ce qui provoque le crash. Comme indiqué sur le site Web:

For using the private end points and subscribing to the API please visit https://theysaidso.com/api.


0 commentaires

0
votes

1
votes

L'API que vous utilisez ici est ceci . Comme l'indique la documentation de l'API, une clé API est requise pour récupérer les données. Comme vous n'avez pas ajouté de clé API dans vos codes, elle devrait renvoyer une réponse infructueuse avec le Code d'état HTTP de 401 .

Et c'est toujours la meilleure pratique pour vérifier si la réponse est réussie avant de procéder à l'exécution des opérations sur les données reçues afin d'éviter les problèmes de plantage dans l'application. Conservez toujours cet extrait de code lorsque vous récupérez des données à partir d'une API:

call.enqueue(new Callback<Example>() {
        @Override
        public void onResponse(Call<Example> call, Response<Example> response) {
                if(response.isSuccessful && response.body() != null){
                    //Get contents & quote
                }
                else {
                    //Check response code & show the relevant error message through Toast or Dialog
                }
        }

        @Override
        public void onFailure(Call call, Throwable t) {
                //Show a failed message to the user
        }
}


0 commentaires

0
votes

Cette API nécessite une Clé d'autorisation pour accéder aux données. Par conséquent, modifiez votre interface GetDataService comme ci-dessous:

public interface GetDataService {
@GET("/quote/random/")
Call<Example> getRandomQuote(@HeaderMap Map<String, String> headerMap);

}

//HeaderMap will have authorization key and its value as <Key,Value> pair.


0 commentaires