在改造中添加标题参数

新手上路,请多包涵

我正在尝试调用一个需要我传递 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 一起工作,因为我一直在调用失败。这是我用于同一服务调用的代码

@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 $

原文由 jamian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 384
2 个回答

在尝试了几次之后,我想出了答案。

错误

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< Data > 的类型而不是 Call< String >

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

原文由 jamian 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

动态 添加 到标题:

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

调用你的方法,即

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

或者

每次都想通过,然后用HTTP Interceptor 创建 一个HttpClient对象:

 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());
            }
        });

然后添加到 Retrofit 对象

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

如果您使用的是 Kotlin,请删除 { } 。否则它将无法正常工作。

原文由 Avinash Verma 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题