Retrofit
是Square旗下的一款為Android和Java打造的類型安全開源HTTP請求構(gòu)造工具针贬。Retrofit的請求構(gòu)造,響應以及數(shù)據(jù)的序列化等都相當?shù)暮啙嵣胶ΑT谶M行了簡單的嘗試之后言疗,將自己的使用心得做一個記錄。
環(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)絡請求,構(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).
序列化
可以看出七蜘,請求的響應數(shù)據(jù)結(jié)構(gòu)是ResponseBody<IpInfo>
谭溉,響應的數(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)絡請求柜与,并成功接受到響應數(shù)據(jù)。整個網(wǎng)絡執(zhí)行層的代碼僅僅十多行嵌灰。