Retrofit根据ID获取OMDBAPI详情返回空值问题求助
解决OMDB API详情请求返回空值的问题
看起来你在Retrofit接口定义上犯了一个参数匹配的错误,这直接导致请求URL不符合OMDB API的要求,所以返回了空值。咱们一步步来修正:
问题根源分析
OMDB API的详情请求需要的是i参数来传递imdbID(比如示例URL里的i=tt037),但你的接口定义有两处错误:
- 你在
@GET的路径里硬编码了&i=,这会在URL里生成多余的空值参数 - 你用
@Query("imdbID")来传递ID,而OMDB API期望的参数名是i,不是imdbID
这两个错误叠加后,实际生成的请求URL会变成:http://www.omdbapi.com/?apikey=3e974fca&i=&imdbID=tg037
显然这个URL不符合API要求,所以返回空数据。
修正后的APIService接口
你有两种正确的写法可以选择:
写法一:硬编码apikey,用@Query传递i参数
public interface APIService { // 移除@GET里的&i=,用@Query("i")传递imdbID @GET("?apikey=3e974fca") Call<Example> getDetails(@Query("i") String imdbId); }
写法二:把apikey也作为@Query参数(更灵活,方便后续修改)
public interface APIService { @GET("") Call<Example> getDetails( @Query("apikey") String apiKey, @Query("i") String imdbId ); } // 调用时需要传入apikey: Call<Example> call1 = mAPIService.getDetails("3e974fca", id);
额外检查项
除了接口修正,还要确认你的Example实体类是否正确映射了OMDB API返回的JSON字段:
- 确保实体类的字段名和JSON返回的键名一致,或者用
@SerializedName注解做映射(比如JSON里是Actors,实体类里如果是actors,需要加@SerializedName("Actors")) - 检查实体类的字段类型是否匹配(比如字符串、整数等)
修正后的loginRetrofitFlag方法(对应写法一)
private void loginRetrofitFlag(String id) { Call<Example> call1 = mAPIService.getDetails(id); call1.enqueue(new Callback<Example>() { @Override public void onResponse(Call<Example> call, Response<Example> response) { if (response.isSuccessful() && response.body() != null) { Example loginResponse = response.body(); Log.e("test", loginResponse.getActors()); } else { // 处理请求成功但返回空的情况,比如打印响应码 Log.e("test", "Response not successful: " + response.code()); } } @Override public void onFailure(Call<Example> call, Throwable t) { Log.e("test", "Request failed: " + t.getMessage()); call.cancel(); } }); }
这样修改后,生成的请求URL就会符合OMDB API的要求(比如http://www.omdbapi.com/?apikey=3e974fca&i=tg037),应该就能正确获取到详情数据了。
内容的提问来源于stack exchange,提问作者balvin
相关产品推荐
相关产品推荐

