Retrofit 2.0 使用教程

本文的詳細的使用細節請參考:https://blog.csdn.net/carson_ho/article/details/73732076

Android Retrofit 2.0 使用-補充篇

Retrofit的簡易封裝:https://blog.csdn.net/whj9073/article/details/84991663

使用 Retrofit 的步驟共有7個:

步驟1:添加Retrofit庫的依賴 
步驟2:創建 接收服務器返回數據 的類 
步驟3:創建 用於描述網絡請求 的接口 
步驟4:創建 Retrofit 實例 
步驟5:創建 網絡請求接口實例 並 配置網絡請求參數 

步驟6:發送網絡請求(異步 / 同步),封裝了 數據轉換、線程切換的操作

步驟7: 處理服務器返回的數據

 

實例講解:

1. 在 Gradle加入Retrofit庫的依賴

由於Retrofit是基於OkHttp,所以還需要添加OkHttp庫依賴

build.gradle

dependencies {
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    // Retrofit庫
    compile 'com.squareup.okhttp3:okhttp:3.1.2'
    // Okhttp庫
  }

2. 添加 網絡權限 
AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

步驟2:創建 接收服務器返回數據 的類
金山詞霸API 的數據格式說明如下:
// URL模板
http://fy.iciba.com/ajax.php

// URL實例
http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world

// 參數說明:
// a:固定值 fy
// f:原文內容類型,日語取 ja,中文取 zh,英語取 en,韓語取 ko,德語取 de,西班牙語取 es,法語取 fr,自動則取 auto
// t:譯文內容類型,日語取 ja,中文取 zh,英語取 en,韓語取 ko,德語取 de,西班牙語取 es,法語取 fr,自動則取 auto
// w:查詢內容

  • 根據 金山詞霸API 的數據格式,創建 接收服務器返回數據 的類:

Translation.java

public class Translation {
        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() {
        System.out.println(status);

        System.out.println(content.from);
        System.out.println(content.to);
        System.out.println(content.vendor);
        System.out.println(content.out);
        System.out.println(content.errNo);
    }
}

步驟3:創建 用於描述網絡請求 的接口

採用 註解 描述 網絡請求參數。 
GetRequest_Interface.java

public interface GetRequest_Interface {

 @GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world")
    Call<Translation> getCall();
    // 註解裏傳入 網絡請求 的部分URL地址
    // Retrofit把網絡請求的URL分成了兩部分:一部分放在Retrofit對象裏,另一部分放在網絡請求接口裏
    // 如果接口裏的url是一個完整的網址,那麼放在Retrofit對象裏的URL可以忽略
    // getCall()是接受網絡請求數據的方法
}

接下來的步驟均在GetRequest.java內實現(看註釋)

步驟4:創建Retrofit對象 
步驟5:創建 網絡請求接口 的實例 
步驟6:發送網絡請求

以最常用的 異步請求 爲例:

GetRequest.java

public class GetRequest extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        request();
        // 使用Retrofit封裝的方法
    }
    public void request() {

        //步驟4:創建Retrofit對象
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://fy.iciba.com/") // 設置 網絡請求 Url
                .addConverterFactory(GsonConverterFactory.create()) //設置使用Gson解析(記得加入依賴)
                .build();

        // 步驟5:創建 網絡請求接口 的實例
        GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);

        //對 發送請求 進行封裝
        Call<Translation> call = request.getCall();

        //步驟6:發送網絡請求(異步)
        call.enqueue(new Callback<Translation>() {
            //請求成功時回調
            @Override
            public void onResponse(Call<Translation> call, Response<Translation> response) {
                // 步驟7:處理返回的數據結果
                response.body().show();
            }

            //請求失敗時回調
            @Override
            public void onFailure(Call<Translation> call, Throwable throwable) {
                System.out.println("連接失敗");
            }
        });
    }
}

由於此處採用了 Gson 解析,所以需要在 Gradle加入依賴 
build.gradle

compile 'com.squareup.retrofit2:converter-gson:2.0.2'

運行結果

è¿è¡ç»æ

Demo地址

Carson_Ho的Github:https://github.com/Carson-Ho/RetrofitDemo

 

4.2 實例2

 

  • 實現的功能:將 英文 翻譯成 中文
  • 實現方法:採用Post方法對 有道API 發送網絡請求 
  • 採用 Gson 進行數據解析

步驟1:添加Retrofit庫的依賴

1. 在 Gradle加入Retrofit庫的依賴

由於Retrofit是基於OkHttp,所以還需要添加OkHttp庫依賴

build.gradle

dependencies {
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    // Retrofit庫
    compile 'com.squareup.okhttp3:okhttp:3.1.2'
    // Okhttp庫
  }

2. 添加 網絡權限 
AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

步驟2:創建 接收服務器返回數據 的類

 

 

  • API 的數據格式說明如下:

// URL
http://fanyi.youdao.com/translate

// URL實例
http://fanyi.youdao.com/translate?doctype=json&jsonversion=&type=&keyfrom=&model=&mid=&imei=&vendor=&screen=&ssid=&network=&abtest=
// 參數說明
// doctype:json 或 xml
// jsonversion:如果 doctype 值是 xml,則去除該值,若 doctype 值是 json,該值爲空即可
// xmlVersion:如果 doctype 值是 json,則去除該值,若 doctype 值是 xml,該值爲空即可
// type:語言自動檢測時爲 null,爲 null 時可爲空。英譯中爲 EN2ZH_CN,中譯英爲 ZH_CN2EN,日譯中爲 JA2ZH_CN,中譯日爲 ZH_CN2JA,韓譯中爲 KR2ZH_CN,中譯韓爲 ZH_CN2KR,中譯法爲 ZH_CN2FR,法譯中爲 FR2ZH_CN
// keyform:mdict. + 版本號 + .手機平臺。可爲空
// model:手機型號。可爲空
// mid:平臺版本。可爲空
// imei:???。可爲空
// vendor:應用下載平臺。可爲空
// screen:屏幕寬高。可爲空
// ssid:用戶名。可爲空
// abtest:???。可爲空

// 請求方式說明
// 請求方式:POST
// 請求體:i
// 請求格式:x-www-form-urlencoded

æ°æ®æ ¼å¼è¯´æ

Translation.java

 

  • 根據 有道API 的數據格式,創建 接收服務器返回數據 的類:

public class Translation1 {

    private String type;
    private int errorCode;
    private int elapsedTime;
    private List<List<TranslateResultBean>> translateResult;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(int errorCode) {
        this.errorCode = errorCode;
    }

    public int getElapsedTime() {
        return elapsedTime;
    }

    public void setElapsedTime(int elapsedTime) {
        this.elapsedTime = elapsedTime;
    }

    public List<List<TranslateResultBean>> getTranslateResult() {
        return translateResult;
    }

    public void setTranslateResult(List<List<TranslateResultBean>> translateResult) {
        this.translateResult = translateResult;
    }

    public static class TranslateResultBean {
        /**
         * src : merry me
         * tgt : 我快樂
         */

        public String src;
        public String tgt;

        public String getSrc() {
            return src;
        }

        public void setSrc(String src) {
            this.src = src;
        }

        public String getTgt() {
            return tgt;
        }

        public void setTgt(String tgt) {
            this.tgt = tgt;
        }
    }

}

步驟3:創建 用於描述網絡請求 的接口

採用 註解 描述 網絡請求參數。

PostRequest_Interface.java

public interface PostRequest_Interface {

    @POST("translate?doctype=json&jsonversion=&type=&keyfrom=&model=&mid=&imei=&vendor=&screen=&ssid=&network=&abtest=")
    @FormUrlEncoded
    Call<Translation1> getCall(@Field("i") String targetSentence);
    //採用@Post表示Post方法進行請求(傳入部分url地址)
    // 採用@FormUrlEncoded註解的原因:API規定採用請求格式x-www-form-urlencoded,即表單形式
    // 需要配合@Field 向服務器提交需要的字段
}

接下來的步驟均在PostRequest.java內實現(看註釋)

步驟4:創建Retrofit對象 
步驟5:創建 網絡請求接口 的實例 
步驟6:發送網絡請求

以最常用的 異步請求 爲例:

步驟7:處理返回數據

PostRequest.java

public class PostRequest extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        request();
    }
    public void request() {

        //步驟4:創建Retrofit對象
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://fanyi.youdao.com/") // 設置 網絡請求 Url
                .addConverterFactory(GsonConverterFactory.create()) //設置使用Gson解析(記得加入依賴)
                .build();

        // 步驟5:創建 網絡請求接口 的實例
        PostRequest_Interface request = retrofit.create(PostRequest_Interface.class);

        //對 發送請求 進行封裝(設置需要翻譯的內容)
        Call<Translation1> call = request.getCall("I love you");

        //步驟6:發送網絡請求(異步)
        call.enqueue(new Callback<Translation1>() {

            //請求成功時回調
            @Override
            public void onResponse(Call<Translation1> call, Response<Translation1> response) {
                // 步驟7:處理返回的數據結果:輸出翻譯的內容
                System.out.println(response.body().getTranslateResult().get(0).get(0).getTgt());
            }

            //請求失敗時回調
            @Override
            public void onFailure(Call<Translation1> call, Throwable throwable) {
                System.out.println("請求失敗");
                System.out.println(throwable.getMessage());
            }
        });
    }


}

由於此處採用了 Gson 解析,所以需要在 Gradle 加入依賴 
build.gradle

compile 'com.squareup.retrofit2:converter-gson:2.0.2'

運行結果è¿è¡ç»æ

Demo地址

Carson_Ho的Github:https://github.com/Carson-Ho/RetrofitDemo

Retrofit 的拓展使用

<-- 主要在創建Retrofit對象中設置 -->
Retrofit retrofit = new Retrofit.Builder()
  .baseUrl(""http://fanyi.youdao.com/"")
  .addConverterFactory(ProtoConverterFactory.create()) // 支持Prototocobuff解析
  .addConverterFactory(GsonConverterFactory.create()) // 支持Gson解析
  .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 支持RxJava
  .build();

 

  • Retrofit的使用場景非常豐富,如支持RxJavaPrototocobuff
  • 具體設置也非常簡單 & 方便:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章