Retrofit2,简单使用测试

接口定义:

public interface RetrofitWeatherService {

    @GET("data/sk/{cityId}.html")
    Call<ResponseBody> getWeatherInfo(@Path("cityId") String cityId);
}

调用测试:

public class RetrofitServiceMain {
    public static void main(String[] args) throws IOException {

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://www.weather.com.cn/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    RetrofitWeatherService subService = retrofit.create(RetrofitWeatherService.class);
    Call<ResponseBody> call = subService.getWeatherInfo("101010100");

    ResponseBody info = call.execute().body();
    System.out.println(info.string());


    System.out.println("异步方式调用:");
    Call<ResponseBody> asynCall = call.clone(); // 因为call只能使用一次,所以如果想多次数用,可以使用clone()新建一个对象;
    asynCall.enqueue(new Callback<ResponseBody>() {
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            try {
                System.out.println(response.body().string());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        public void onFailure(Call<ResponseBody> call, Throwable t) {

        }
    });

}
}

输出内容:

{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"18","WD":"东南风","WS":"1级","SD":"17%","WSE":"1","time":"17:05","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB","njd":"暂无实况","qy":"1011","rain":"0"}}

返回实体定义:

public class WeatherInfo { 

    private String city;
    private String cityid;
    private String temp;
    private String WD;
    private String WS;
    private String SD;
    private String WSE;
    private String time;
    private String isRadar;
    private String Radar;
    private String njd;
    private String qy;
    private String rain;
    
    // get set 方法略

    @Override
    public String toString() {
        return "WeatherInfo{" +
                "city='" + city + '\'' +
                ", cityid='" + cityid + '\'' +
                ", temp='" + temp + '\'' +
                ", WD='" + WD + '\'' +
                ", WS='" + WS + '\'' +
                ", SD='" + SD + '\'' +
                ", WSE='" + WSE + '\'' +
                ", time='" + time + '\'' +
                ", isRadar='" + isRadar + '\'' +
                ", Radar='" + Radar + '\'' +
                ", njd='" + njd + '\'' +
                ", qy='" + qy + '\'' +
                ", rain='" + rain + '\'' +
                '}';
    }
}

问题集锦:

Q:Caused by: java.lang.IllegalArgumentException: Could not locate ResponseBody converter for.....

A:主要是因为序列化组件缺失造成序列化失败;解决方案就是引入对应的组件即可;retrofit支持jackson、gson、protobuffer、moshi等;

<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>retrofit</artifactId>
    <version>2.1.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.squareup.retrofit2/converter-gson -->
<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>converter-gson</artifactId>
    <version>2.1.0</version>
</dependency>

Q:java.lang.IllegalArgumentException: Service methods cannot return void

A:修改Service层返回值为Call类型,并调用Call.execute()或者Call.enqueue(CallBack)方法。

posted @ 2017-09-08 18:42  iMhager  阅读(747)  评论(0编辑  收藏  举报