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(); }
4 Réponses :
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.
https://theysaidso.com/api/ Depuis le site Web de l'API, vous trouverez le lien pour accéder au devis ramdom
voici le lien:
http://quotes.rest/quote/random.json?api_key= a>
sans la clé, vous obtiendrez un accès non autorisé
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 } }
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.
log
body ()
vérifie d'abord quelles données il renvoieCela 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.