Добавить параметр заголовка в дооснащение

Я пытаюсь вызвать 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 < Data​​strong →

Данные, являющиеся классом 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. Затем вызовите запрос, который он будет работать. .