我正在尝试调用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 $
答案 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 apihttps://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
接受最后两个参数作为标题字段,即accept
和user-key
。但是在调用方法时,您首先要传递标题。
如您在方法签名getRestaurantsBySearch
答案 4 :(得分:0)