Добавить параметр заголовка в Retrofit
Я пытаюсь позвонить и api, который требует, чтобы я передал ключ API.
мой вызов Sercive с помощью HtppURLconnection работает отлично.
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());
}
Howevver, я не уверен, как это работает с RetroFit, так как мой вызов постоянно терпит неудачу. Вот код, который я usiong для того же вызова службы
@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);
и я использую это, чтобы назвать это
Call<String> call = endpoint.getRestaurantsBySearch("3","city","mumbai","application/json","9900a9720d31dfd5fdb4352700c");
все эти вызовы собираются в метод OnFailure в RetroFit. Если я пошлю его ... без HeaderParameters он идет в успех с 403 beacuse мне, очевидно, нужно передать ключ api где-то, но я не могу понять, как.
@GET("search")
Call<String> getRestaurantsBySearch(@Query("entity_id") String entity_id, @Query("entity_type") String entity_type, @Query("q") String query);
ошибка, которую я получаю в OnFailure, это
java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $
5 ответов
вы можете использовать следующие
@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);
и
Call<String> call = endpoint.getRestaurantsBySearch("3","city","cafes");
вышеизложенное основано на api zomato, который документирован в
https://developers.zomato.com/documentation#!/ресторан / поиск
следует отметить, что изменение конечной точки api / v2.1 / Поиск и заголовок @Headers("user-key: 9900a9720d31dfd5fdb4352700c")
.
также проверьте свой базовый url .baseUrl("https://developers.zomato.com/")
также я попробовал выше с помощью ключа api, который я создал, и он работает и мой вопрос был кафе как было предложено в документации zomato.
примечание : Я надеюсь, что у вас есть ниже
.addConverterFactory(ScalarsConverterFactory.create()) // for string conversion
.build();
и ниже в строй.файл gradle
compile group: 'com.squareup.retrofit2', name: 'converter-scalars', version: '2.2.0'
Edit:
вы также можете передать заголовок с динамическим значением, как показано ниже
@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);
и
Call<String> call = endpoint.getRestaurantsBySearch("3","city","cafes","9900a9720d31dfd5fdb4352700c");
попробуйте этот тип заголовка для дооснащения 1.9 и 2.0. Для Типа Контента Json.
@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
вы можете добавить еще много заголовков i.e
@Headers({
"Accept: application/json",
"User-Agent: Your-App-Name",
"Cache-Control: max-age=640000"
})
попробовав пару раз, я понял ответ.
ошибка
java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $
шел из-за сбоя разбора json.
в вызове метода я передавал строку вместо класса 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);
Я должен был пройти вместо вызовастрока> тип вызовасведения>
данные, являющиеся классом Pojo
что-то вроде это
@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);
насколько я вижу, вы передаете данные неправильно.
Ваш метод getRestaurantsBySearch
принимает последние два параметра в качестве поля заголовка i.e accept
и user-key
. Но при вызове метода вы сначала передаете заголовки.
Передайте данные, как вы их объявили в сигнатуре метода getRestaurantsBySearch
пожалуйста, взгляните на ответ. Это ясно показывает, что API-ключ указан неверно. Сначала вы получаете правильный ключ API. Затем вызовите запрос, он будет работать .