接口
http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world
Retrofit在使用的过程中是支持泛型的,使用泛型可以简化代码,避免不必要的数据解析
在前面的两个例子中,使用的都是ResponseBody,关于泛型的使用其实就是类似java的Bean,
这是接口返回json,所有的json基本都是这个结构,可能名称不一样。比如status 在可能是code,content是data,
{
"status": 1,
"content": {
"from": "en-EU",
"to": "zh-CN",
"out": "示例",
"vendor": "ciba",
"err_no": 0
}
}
在使用泛型的时候需要使用一些别的支持
使用gson解析数据,提供bean,gson自动解析数据
//依赖地址
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
使用上面的json写个javabean,作为retrofit的泛型
public class Bean{
private int status;
private content content;
private static class content {
private String from;
private String to;
private String vendor;
private String out;
private int errNo;
}
//定义 输出返回数据 的方法
public void show() {
Log.i("bean",status);
Log.i("bean",content.from);
Log.i("bean",content.to);
Log.i("bean",content.vendor);
Log.i("bean",content.out);
Log.i("bean",content.errNo+"");
}
}
接口类中
这里放了两个接口,注意Call的泛型
public interface Api {
@GET("GetMoreWeather")
Call<ResponseBody> getWeather(@QueryMap Map<String,String> map);
@GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world")
Call<Bean> getCall();
}
activity的diam
//步骤4:创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
// 设置 网络请求 Url
.baseUrl("http://fy.iciba.com/")
//设置使用Gson解析(记得加入gson依赖,如果不加依赖而是用泛型,会报错,当然也有别的解析方法,不过gson最常使用)
.addConverterFactory(GsonConverterFactory.create())
.build();
Api api = retrofit.create(Api.class);
//对 发送请求 进行封装
Call<Bean> call = api.getCall();
//步骤6:发送网络请求(异步)
call.enqueue(new Callback<Bean>() {
//请求成功时回调
@Override
public void onResponse(Call<Bean> call, Response<Bean> response) {
// 步骤7:处理返回的数据结果
response.body().show();
}
//请求失败时回调
@Override
public void onFailure(Call<Bean> call, Throwable throwable) {
System.out.println("连接失败");
}
});
ps :个人建议这个泛型的使用在简单的json上使用,有时候复杂的json还是自己解析的,bean嵌套太深,不方便维护。而且后台返回的数据不一定都有用,使用gson全解析太浪费时间。