我正在使用wunderground API制作天气应用程序。我也在使用Retrofit2和GSON库。
以下是获取JSON响应的API URL格式:
http://api.wunderground.com/api/API_KEY/conditions/q/ISO_COUNTRY_CODE/CITY_NAME.json
我已经声明了一个java API_Interface,如下所示:
public interface API_Interface {
@GET("/api/{apikey}/conditions/q/BD/{city}.json")
Call<CurrentObservation> getCurrentWeather(
@Path("apikey") String apikey,
@Path("city") String city);
}
并尝试从apikey
传递city
和MainActivity
,如下所示:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
API_Interface weatherService = retrofit.create(API_Interface.class);
Call<CurrentObservation> call = weatherService.getCurrentWeather(Constants.API_KEY,"Dhaka");
call.enqueue(new Callback<CurrentObservation>() {
@Override
public void onResponse(Call<CurrentObservation> call, Response<CurrentObservation> response) {
textView.setText(response.body().toString());
Log.d("result",response.body().toString());
}
@Override
public void onFailure(Call<CurrentObservation> call, Throwable t) {
textView.setText("Something went wrong: " + t.getMessage());
Log.e("error",t.getMessage());
}
});
以下是Constant
类:
public class Constants {
public static final String BASE_URL="http://api.wunderground.com";
public static final String API_KEY="b5efba6dc63cc1b1";
}
这里是CurrentObservation
类的POJO模型:http://paste.ubuntu.com/22291964/
我在模型中覆盖了toString()方法。
还有其他一些POJO课程 -
但是这种方法给出了如下的空响应 -
Weather Status: null
Pressure: null
Humidity: null
Temperature: null
以下是来自API网址的实际JSON响应 - http://paste.ubuntu.com/22292683/
如何将参数传递给@GET以获得正确的响应?
答案 0 :(得分:1)
您的基本网址应如下所示:
http://blah.com/api/blah/
您的@GET
方法应该有这样的网址
api/{apikey}/conditions/q/BD/{city}.json
编辑:您可能会onResponse
调用error body
。请根据您的用例调整以下代码:
public static boolean handleError(Retrofit retrofit, Response<?> response) {
if(response != null && !response.isSuccessful() && response.errorBody() != null) {
Converter<ResponseBody, ErrorResponse> converter = retrofit.responseBodyConverter(ErrorResponse.class, new Annotation[0]);
try {
ErrorResponse errorResponse = converter.convert(response.errorBody());
// do something
} catch(IOException e) {
Log.e(TAG, "An error occurred", e);
}
return true;
}
return false;
}
答案 1 :(得分:0)
您可以这样做:
@GET
Call<CurrentObservation> getCurrentWeather(@Url String url);