Добавить параметр заголовка в 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


enter image description here

пожалуйста, взгляните на ответ. Это ясно показывает, что API-ключ указан неверно. Сначала вы получаете правильный ключ API. Затем вызовите запрос, он будет работать .