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 $
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);
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");
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"
})
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.