Retrofit 是Square旗下的一款為Android和Java打造的類型安全開源HTTP請求構(gòu)造工具。Retrofit的請求構(gòu)造,響應(yīng)以及數(shù)據(jù)的序列化等都相當(dāng)?shù)暮啙?。在進行了簡單的嘗試之后,將自己的使用心得做一個記錄。
環(huán)境
平臺:Android Studio2.2.3
Retrofit版本:2.1
測試接口:http://ip.taobao.com/
使用前配置
在 Android Studio 平臺下,可以通過構(gòu)建工具 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 請求構(gòu)造體。如果想要引入Gson進行序列化和反序列化的操作,則需要在工程中引入converter-gson工具。同時,官網(wǎng)還提供了其他幾種轉(zhuǎn)化工具:
-
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
同步完成之后就能夠進行開發(fā)了
Retrofit的使用
想要完成一次網(wǎng)絡(luò)請求,構(gòu)造請求,發(fā)起請求,接受回調(diào)是最基本的三個步驟。我們接下來就從這三個方面切入Retrofit的世界
構(gòu)造請求
Retrofit是基于注解構(gòu)造的。我想要發(fā)起對一個ip地址的查詢請求,首先要構(gòu)造這個請求,通過對接口文檔的查詢,請求是以Get的方式傳入一個ip地址就夠了。整個請求的構(gòu)造非常簡單
public interface ApiService {
@GET("service/getIpInfo.php")
Call<ResponseBody<IpInfo>> getIpInfo(@Query("ip") String ip);
}
在接口上注解上請求的方式(GET)和路徑(service/getIpInfo.php),要查詢(@Query)的參數(shù)key(ip)和值(ip).
序列化
可以看出,請求的響應(yīng)數(shù)據(jù)結(jié)構(gòu)是ResponseBody<IpInfo>,響應(yīng)的數(shù)據(jù)可以直接被反序列化成一個pojo供我們直接調(diào)用。
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);
}
}
發(fā)起請求并獲取回調(diào)
發(fā)起請求需要先構(gòu)造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);
}
});
總結(jié)
整個流程如上面所示,很簡單的發(fā)起一次網(wǎng)絡(luò)請求,并成功接受到響應(yīng)數(shù)據(jù)。整個網(wǎng)絡(luò)執(zhí)行層的代碼僅僅十多行。