在Retrofit中添加标题参数

时间:2017-03-20 08:33:41

标签: android retrofit httpurlconnection

我正在尝试调用api,这需要我传入一个API密钥。

使用HtppURLconnection进行的Sercive调用非常有效。

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作为我在任何时候进入失败的呼吁。 下面是我用于同一服务电话的代码

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

所有这些调用都进入了RetroFit中的OnFailure方法。 如果我在没有HeaderParameters的情况下发送它,那么它会因为403而进入Success成功,我显然需要在某处传递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 个答案:

答案 0 :(得分:28)

您可以使用以下

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

同时检查您的基本网址.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'

编辑:

您还可以使用动态值传递标题,如下所示

@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 :(得分:20)

为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"
    })

答案 2 :(得分:4)

经过多次尝试,我找到了答案。

错误

java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $
由于解析json失败,

即将到来。

在方法调用中,我传递的是String而不是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&lt; String &gt; Call&lt; 数据&gt;

的类型

数据是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);

答案 3 :(得分:0)

据我所知,您正在以错误的方式传递数据。 您的方法getRestaurantsBySearch接受最后两个参数作为标题字段,即acceptuser-key。但是在调用方法时,您首先要传递标题。 如您在方法签名getRestaurantsBySearch

中声明的那样传递数据

答案 4 :(得分:0)

enter image description here

请查看回复。它清楚地表明你提供的api密钥是错误的。首先,您将获得正确的api密钥。然后调用它将起作用的请求