本文的詳細的使用細節請參考:https://blog.csdn.net/carson_ho/article/details/73732076
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的使用場景非常豐富,如支持
RxJava
和Prototocobuff
- 具體設置也非常簡單 & 方便: