Retrofit
是Square旗下的一款为Android和Java打造的类型安全开源HTTP请求构造工具。Retrofit的请求构造,响应以及数据的序列化等都相当的简洁。在进行了简单的尝试之后,将自己的使用心得做一个记录。
环境
平台:Android Studio2.2.3
Retrofit版本:2.1
测试接口:http://ip.taobao.com/
使用前配置
在 Android Studio 平台下,可以通过构建工具 Gradle
很简单的将 Retrofit
引入到工程中来,在 app:build.gradle
中引入以下依赖
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.google.code.gson:gson:2.4'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
在工程中,我引入 Google 的Gson
作为整个工程的序列化工具,Retrofit
本身只能反序列化 OkHttp
的 ResponseBody
,或者使用注解@Body
接受它的 RequestBody
请求构造体。如果想要引入Gson进行序列化和反序列化的操作,则需要在工程中引入converter-gson
工具。同时,官网还提供了其他几种转化工具:
-
Gson
: com.squareup.retrofit2:converter-gson -
Jackson
: com.squareup.retrofit2:converter-jackson -
Moshi
: com.squareup.retrofit2:converter-moshi -
Protobuf
: com.squareup.retrofit2:converter-protobuf -
Wire
: com.squareup.retrofit2:converter-wire -
Simple XML
: com.squareup.retrofit2:converter-simplexml -
Scalars (primitives, boxed, and String)
: com.squareup.retrofit2:converter-scalars
同步完成之后就能够进行开发了
Retrofit的使用
想要完成一次网络请求,构造请求,发起请求,接受回调是最基本的三个步骤。我们接下来就从这三个方面切入Retrofit的世界
构造请求
Retrofit
是基于注解构造的。我想要发起对一个ip地址的查询请求,首先要构造这个请求,通过对接口文档的查询,请求是以Get
的方式传入一个ip地址就够了。整个请求的构造非常简单
public interface ApiService {
@GET("service/getIpInfo.php")
Call<ResponseBody<IpInfo>> getIpInfo(@Query("ip") String ip);
}
在接口上注解上请求的方式(GET)和路径(service/getIpInfo.php),要查询(@Query)的参数key(ip)和值(ip).
序列化
可以看出,请求的响应数据结构是ResponseBody<IpInfo>
,响应的数据可以直接被反序列化成一个pojo供我们直接调用。
ResponseBody
public class ResponseBody<T> {
private int code;
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
@Override
public String toString() {
return new Gson().toJson(this);
}
}
IpInfo
public class IpInfo {
/**
* country : 中国
* country_id : CN
* area : 西南
* area_id : 500000
* region : 四川省
* region_id : 510000
* city : 成都市
* city_id : 510100
* county :
* county_id : -1
* isp : 电信
* isp_id : 100017
* ip : 171.221.144.107
*/
private String country;
private String country_id;
private String area;
private String area_id;
private String region;
private String region_id;
private String city;
private String city_id;
private String county;
private String county_id;
private String isp;
private String isp_id;
private String ip;
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getCountry_id() {
return country_id;
}
public void setCountry_id(String country_id) {
this.country_id = country_id;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getArea_id() {
return area_id;
}
public void setArea_id(String area_id) {
this.area_id = area_id;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public String getRegion_id() {
return region_id;
}
public void setRegion_id(String region_id) {
this.region_id = region_id;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCity_id() {
return city_id;
}
public void setCity_id(String city_id) {
this.city_id = city_id;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
public String getCounty_id() {
return county_id;
}
public void setCounty_id(String county_id) {
this.county_id = county_id;
}
public String getIsp() {
return isp;
}
public void setIsp(String isp) {
this.isp = isp;
}
public String getIsp_id() {
return isp_id;
}
public void setIsp_id(String isp_id) {
this.isp_id = isp_id;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
@Override
public String toString() {
return new Gson().toJson(this);
}
}
发起请求并获取回调
发起请求需要先构造Retrofit
对象,并在该对象保存一些基本的信息,比如BaseUrl和ConvertFactory等信息。然后通过Retrofit
对象实例化我们的接口对象ApiService
.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://ip.taobao.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiService apiService = retrofit.create(ApiService.class);
Call<ResponseBody<IpInfo>> call = apiService.getIpInfo("171.221.144.107");
call.enqueue(new Callback<ResponseBody<IpInfo>>() {
@Override
public void onResponse(Call<ResponseBody<IpInfo>> call, Response<ResponseBody<IpInfo>> response) {
ResponseBody<IpInfo> ipInfoResponseBody = response.body();
}
@Override
public void onFailure(Call<ResponseBody<IpInfo>> call, Throwable t) {
progressBar.setVisibility(View.GONE);
}
});
总结
整个流程如上面所示,很简单的发起一次网络请求,并成功接受到响应数据。整个网络执行层的代码仅仅十多行。