Добавить параметр заголовка в дооснащение
Я пытаюсь вызвать API, который требует, чтобы я передал ключ API.
Мой Сервисный вызов с использованием HttpURLConnection работает отлично.
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());
}
Тем не менее, я не уверен, как это работает с RetroFit, так как я постоянно звонил в Failure.
Вот код, который я использую для того же вызова службы
@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, потому что мне, очевидно, нужно где-то передать ключ 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 $
Ответы
Ответ 1
Попробовав пару раз, я понял ответ.
Ошибка
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);
Мне нужно было бы вместо Call < String передать тип Call < Datastrong →
Данные, являющиеся классом 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);
Ответ 2
Вы можете использовать ниже
@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");
Вышеуказанное основано на zomato api, которое описано в
https://developers.zomato.com/documentation#!/restaurant/search
Следует отметить изменение конечной точки api/v2.1/search и заголовок @Headers("user-key: 9900a9720d31dfd5fdb4352700c")
.
Также проверьте свой базовый url .baseUrl("https://developers.zomato.com/")
Кроме того, я попытался сделать это с помощью ключа api, который я сгенерировал, и он работает
и мой запрос был cafes, как предложено документацию по zomato.
Примечание. Я надеюсь, что у вас есть
.addConverterFactory(ScalarsConverterFactory.create()) // for string conversion
.build();
и ниже в файле 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");
Ответ 3
Попробуйте этот тип заголовка для Retrofit 1.9 и 2.0. Для типа содержимого Json.
@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
Вы можете добавить еще много заголовков, т.е.
@Headers({
"Accept: application/json",
"User-Agent: Your-App-Name",
"Cache-Control: max-age=640000"
})
ОБНОВЛЕНИЕ, если вы используете Kotlin, удалите { }
, иначе он не будет работать
Ответ 4
Насколько я вижу, вы неправильно передаете данные.
Ваш метод getRestaurantsBySearch
принимает последние два параметра как поле заголовка i.e accept
и user-key
. Но при вызове метода вы сначала пропускаете заголовки.
Передайте данные, как вы заявили это в сигнатуре метода getRestaurantsBySearch
Ответ 5
![введите описание изображения здесь]()
Пожалуйста, взгляните на ответ. Это ясно показывает, что ключ api, который вы указали, неверен. Сначала вы получаете правильный ключ api. Затем вызовите запрос, который он будет работать.
.