J'essaie d'appeler et d'api, ce qui m'oblige à transmettre une clé API.
Mon appel Sercive utilisant HtppURLconnection fonctionne parfaitement.
url = new URL("https://developers.zomato.com/api/v2.1/search?entity_id=3&entity_type=city&q=" + params[0]);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestProperty("user-key","9900a9720d31dfd5fdb4352700c");
if (urlConnection.getResponseCode() != 200) {
Toast.makeText(con, "url connection response not 200 | " + urlConnection.getResponseCode(), Toast.LENGTH_SHORT).show();
Log.d("jamian", "url connection response not 200 | " + urlConnection.getResponseCode());
throw new RuntimeException("Failed : HTTP error code : " + urlConnection.getResponseCode());
}
Cependant, je ne suis pas sûr de savoir comment cela fonctionne avec RetroFit car mon appel est toujours en échec . Voici le code que je suis en train d'utiliser pour le même appel de service
@GET("search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query,@Header("Accept") String accept, @Header("user-key") String userkey);
et je l'utilise pour l'appeler
Call<String> call = endpoint.getRestaurantsBySearch("3","city","mumbai","application/json","9900a9720d31dfd5fdb4352700c");
Tous ces appels vont à la méthode OnFailure dans RetroFit . Si je l’envoie sans les paramètres HeaderParameters, il entre dans Success avec un 403 parce que j’ai évidemment besoin de passer la clé API quelque part, mais je ne peux pas comprendre comment.
@GET("search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query);
L'erreur que je reçois dans OnFailure est
Java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $
Après avoir essayé plusieurs fois, j'ai compris la réponse.
L'erreur
Java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $
venait en raison de l'échec de l'analyse du JSON.
Dans l'appel de méthode, je passais une chaîne au lieu d'une classe POJO.
@Headers("user-key: 9900a9720d31dfd5fdb4352700c")
@GET("api/v2.1/search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query);
J'aurais dû passer au lieu de Call < String > le type d'appel < Data >
Les données étant la classe Pojo
quelque chose comme ça
@Headers("user-key: 9900a9720d31dfd5fdb4352700c")
@GET("api/v2.1/search")
Call<Data> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query);
Vous pouvez utiliser le ci-dessous
@Headers("user-key: 9900a9720d31dfd5fdb4352700c")
@GET("api/v2.1/search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query);
et
Call<String> call = endpoint.getRestaurantsBySearch("3","city","cafes");
Ce qui précède est basé sur l’API zomato qui est documentée à
https://developers.zomato.com/documentation#!/restaurant/search
Il convient de noter le changement de point final api/v2.1/search et l'en-tête @Headers("user-key: 9900a9720d31dfd5fdb4352700c")
.
Vérifiez également votre URL de base .baseUrl("https://developers.zomato.com/")
En outre, j'ai essayé ce qui précède avec une clé API que j'ai générée et cela fonctionne. et ma requête était cafes comme suggéré dans la documentation de zomato.
Note: j'espère que vous avez le dessous
.addConverterFactory(ScalarsConverterFactory.create()) // for string conversion
.build();
et ci-dessous dans le fichier build.gradle
compile group: 'com.squareup.retrofit2', name: 'converter-scalars', version: '2.2.0'
Modifier:
Vous pouvez également passer l'en-tête avec une valeur dynamique comme ci-dessous
@GET("api/v2.1/search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query,@Header("user-key") String userkey);
Et
Call<String> call = endpoint.getRestaurantsBySearch("3","city","cafes","9900a9720d31dfd5fdb4352700c");
Essayez cet en-tête de type pour Retrofit 1.9 et 2.0. Pour le type de contenu Json.
@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
Vous pouvez ajouter beaucoup d'autres en-têtes, i.e
@Headers({
"Accept: application/json",
"User-Agent: Your-App-Name",
"Cache-Control: max-age=640000"
})
Autant que je sache, vous transmettez les données de manière incorrecte. Votre méthode getRestaurantsBySearch
accepte les deux derniers paramètres en tant que champ d'en-tête i.e accept
et user-key
. Mais lorsque vous appelez la méthode, vous passez d'abord les en-têtes. Transmettez les données telles que vous les avez déclarées dans la signature de méthode de getRestaurantsBySearch