Add Header Parameter in Retrofit Add Header Parameter in Retrofit android android

Add Header Parameter in Retrofit


Try this type header for Retrofit 1.9 and 2.0. For the JSON content type.

@Headers({"Accept: application/json"})@POST("user/classes")Call<playlist> addToPlaylist(@Body PlaylistParm parm);

You can add many more headers, i.e,

@Headers({        "Accept: application/json",        "User-Agent: Your-App-Name",        "Cache-Control: max-age=640000"    })

Dynamically add to headers:

@POST("user/classes")Call<ResponseModel> addToPlaylist(@Header("Content-Type") String content_type, @Body RequestModel req);

Call your method, i.e.,

mAPI.addToPlayList("application/json", playListParam);

Or

Want to pass every time, then create an HttpClient object with the HTTP Interceptor:

OkHttpClient httpClient = new OkHttpClient();        httpClient.networkInterceptors().add(new Interceptor() {            @Override            public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {                Request.Builder requestBuilder = chain.request().newBuilder();                requestBuilder.header("Content-Type", "application/json");                return chain.proceed(requestBuilder.build());            }        });

Then add to a Retrofit object

Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(httpClient).build();

If you are using Kotlin, remove the { }. Else it will not work.


You can use the below

 @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);

and

 Call<String> call = endpoint.getRestaurantsBySearch("3","city","cafes");

The above is based in the zomato api which is documented at

https://developers.zomato.com/documentation#!/restaurant/search

Thing to note is the end point change api/v2.1/search and the Header @Headers("user-key: 9900a9720d31dfd5fdb4352700c").

Also check your base url .baseUrl("https://developers.zomato.com/")

Also i tried the above with a api key i generated and it works and my query was cafes as suggested the zomato documentation.

Note : I hope you have the below

 .addConverterFactory(ScalarsConverterFactory.create()) // for string conversion .build();

and the below in build.gradle file

compile group: 'com.squareup.retrofit2', name: 'converter-scalars', version: '2.2.0'

Edit:

You can also pass header with dynamic value as below

@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);

And

Call<String> call = endpoint.getRestaurantsBySearch("3","city","cafes","9900a9720d31dfd5fdb4352700c");


After trying a couple of times i figured out the answer.

The error

java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $

was coming due the failure of parsing the json.

In the method call I was passing a String instead of a POJO class.

@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);

I should have passed instead of Call<String> the type of Call<Data>

Data being the Pojo class

something like this

@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);