web-dev-qa-db-fra.com

Ajouter un paramètre d'en-tête lors de la modernisation

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 $
16
jamian

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

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");
25
Raghunandan

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"
    })
16
Avinash Verma

 enter image description here

S'il vous plaît jeter un oeil à la réponse. Cela montre clairement que la clé API que vous avez fournie est fausse. Au début, vous obtenez la clé api correcte. Ensuite, appelez la demande, cela fonctionnera .

0
Manoj Perumarath

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

0
Nitin Joshi