wake-up-neo.com

Header-Parameter in Retrofit hinzufügen

Ich versuche zu rufen und api, was erfordert, dass ich einen API-Schlüssel übergeben.

Mein Sercive-Anruf mit HtppURLconnection funktioniert einwandfrei.

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

Ich bin mir jedoch nicht sicher, wie dies mit RetroFit funktioniert, da mein Aufruf immer in Failure geht. Hier ist der Code, den ich für denselben Serviceaufruf benutze

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

und ich benutze das, um es anzurufen

Call<String> call = endpoint.getRestaurantsBySearch("3","city","mumbai","application/json","9900a9720d31dfd5fdb4352700c");

Alle diese Aufrufe gehen in die OnFailure-Methode in RetroFit .. __ Wenn ich sie ohne HeaderParameters schicke, geht sie mit 403 in den Erfolg.

@GET("search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query);

Der Fehler, den ich in OnFailure bekomme, ist 

Java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $
16
jamian

Nach ein paar Versuchen habe ich die Antwort herausgefunden.

Der Fehler

Java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $

kam, weil der Json nicht geparst wurde.

Im Methodenaufruf habe ich einen String statt einer POJO-Klasse übergeben.

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

Ich hätte statt Call < String > die Art von Call < Data > übergeben sollen

Daten sind die Pojo-Klasse

etwas wie das

@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

Sie können das unten verwenden

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

und

 Call<String> call = endpoint.getRestaurantsBySearch("3","city","cafes");

Das oben genannte basiert auf der Zomato-API, die bei dokumentiert ist

https://developers.zomato.com/documentation#!/restaurant/search

Zu beachten ist die Endpunktänderung api/v2.1/search und der Header @Headers("user-key: 9900a9720d31dfd5fdb4352700c").

Überprüfen Sie auch Ihre Basis-URL .baseUrl("https://developers.zomato.com/")

Ich habe es auch mit einem API-Schlüssel ausprobiert, den ich generiert habe, und es funktioniert und meine Abfrage war cafes, wie in der Zomato-Dokumentation vorgeschlagen.

Hinweis: Ich hoffe, Sie haben die unten

 .addConverterFactory(ScalarsConverterFactory.create()) // for string conversion
 .build();

und die unten in build.gradle-Datei

compile group: 'com.squareup.retrofit2', name: 'converter-scalars', version: '2.2.0'

Bearbeiten:

Sie können auch einen Header mit dynamischem Wert wie unten übergeben

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

Und

Call<String> call = endpoint.getRestaurantsBySearch("3","city","cafes","9900a9720d31dfd5fdb4352700c");
25
Raghunandan

Versuchen Sie diesen Typheader für Retrofit 1.9 und 2.0. Für Json Content Type.

@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);

Sie können viele weitere Header hinzufügen, d

@Headers({
        "Accept: application/json",
        "User-Agent: Your-App-Name",
        "Cache-Control: max-age=640000"
    })
16
Avinash Verma

 enter image description here

Bitte schauen Sie sich die Antwort an. Es zeigt deutlich, dass der von Ihnen eingegebene API-Schlüssel falsch ist. Zuerst erhalten Sie den korrekten API-Schlüssel. Dann rufen Sie die Anfrage auf, es wird funktionieren .

0

Soweit ich sehen kann, übergeben Sie die Daten falsch. Ihre Methode getRestaurantsBySearch akzeptiert die letzten beiden Parameter als Headerfeld, dh accept und user-key. Beim Aufrufen der Methode übergeben Sie jedoch zuerst Kopfzeilen. Übergeben Sie die Daten so, wie Sie sie in der Methodensignatur von getRestaurantsBySearch angegeben haben.

0
Nitin Joshi