Android Retrofit 初體驗

RetrofitSquare旗下的一款為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 本身只能反序列化 OkHttpResponseBody,或者使用注解@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對象,并在該對象保存一些基本的信息,比如BaseUrlConvertFactory等信息。然后通過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í)行層的代碼僅僅十多行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容