Retrofit2调用API无内容返回问题:接口Query参数实现合理性咨询及空响应排查
解决Retrofit2调用WeatherStack API返回空响应的问题
我一眼就瞅出你代码里的几个核心问题,这就是拿不到有效响应的根源,咱们一步步来修正:
1. Retrofit接口的URL配置完全错误
你的@GET注解直接把access_key和query参数硬编码在路径里了,这既不符合Retrofit的参数规范,也搞错了WeatherStack的API端点——要获取实时温度的话,正确的端点是current。正确的姿势是:
@GET只写API的端点路径(比如current)- 用
@Query分别传递access_key和query这两个参数,而非直接拼在URL里
修正后的接口代码:
public interface InterfaceCity { @GET("current") Call<CityAlternativa> getTemperature( @Query("access_key") String apiKey, @Query("query") String country ); }
2. 调用接口时遗漏了API密钥参数
原来的代码里根本没传递access_key,现在修正后调用时要把你的密钥传进去:
Call<CityAlternativa> call = interfaciciudad.getTemperature("a2a158295f55407eb8f9b88a957a5bac", ciudad);
3. 响应处理的逻辑有多个漏洞
你直接取response.body()却没做任何校验,而且直接把int类型的温度传给setText()会报错(setText只接受String类型),这些都得改:
call.enqueue(new Callback<CityAlternativa>() { @Override public void onResponse(Call<CityAlternativa> call, Response<CityAlternativa> response) { // 先判断响应是否成功,再确保body不为空 if (response.isSuccessful() && response.body() != null) { CityAlternativa ciudadfinal = response.body(); int temp = ciudadfinal.getTemperature(); mostrarCiudad.setText(String.valueOf(temp)); // int转String后再设置文本 } else { // 处理响应失败的情况,给用户明确提示 mostrarCiudad.setText("响应失败,状态码:" + response.code()); } } @Override public void onFailure(Call<CityAlternativa> call, Throwable t) { mostrarCiudad.setText("读取数据出错:" + t.getMessage()); Log.i("ERROR DETAIL", t.toString()); } });
额外必查:你的CityAlternativa实体类是否匹配API返回结构
WeatherStack的温度字段嵌套在current对象里,所以你的实体类必须和JSON结构对应,比如用@SerializedName注解映射字段:
public class CityAlternativa { @SerializedName("current") private Current current; public int getTemperature() { return current != null ? current.temperature : 0; } static class Current { @SerializedName("temperature") int temperature; } }
调整完这些,你应该就能正常拿到温度数据了。
内容的提问来源于stack exchange,提问作者Moises Calatayud Guillem
相关产品推荐
相关产品推荐

