什么是Retrofit
官方對(duì)Retrofit的定義是:一個(gè)在Android和Java中類型安全的REST客戶端
你可以使用注解去描述HTTP請(qǐng)求,URL 參數(shù)替換和查詢參數(shù)這些都默認(rèn)的得到完整的支持。此外,它還提供了自定義請(qǐng)求頭、多種類型請(qǐng)求體、文件上傳和下載、模擬相應(yīng)和其他更多的功能。接下來我們將會(huì)看到這些具體是實(shí)現(xiàn)詳細(xì)。
先準(zhǔn)備你的安卓項(xiàng)目
在android studio上用Gradle構(gòu)建你的新項(xiàng)目。當(dāng)然也可以選擇在IDE上用Maven構(gòu)建項(xiàng)目。
定義依賴庫:Gradle or Maven
首先你的項(xiàng)目需要依賴Retrofit。在你所選的編譯系統(tǒng)中,在文件build.gradle 或 pom.xml 中導(dǎo)入你所以依賴的指定Retrofit版本,當(dāng)運(yùn)行去編譯代碼的時(shí)候,這個(gè)編譯系統(tǒng)會(huì)下載和提供制定的依賴庫到你的項(xiàng)目中。
Retrofit2
build.gradle
dependencies {
// Retrofit & OkHttp
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
}```
##Android網(wǎng)絡(luò)權(quán)限
用Retrofit進(jìn)行網(wǎng)絡(luò)請(qǐng)求需要在AndroidManifest.xml中添加網(wǎng)絡(luò)權(quán)限
```Java
<uses-permission android:name="android.permission.INTERNET" /> ```
##如何描述API端點(diǎn)
首先你需要定義接口和對(duì)應(yīng)的請(qǐng)求方法
##GitHub Client
以下demo定義了GitHubClient接口和reposForUser方法去請(qǐng)求一組倉庫貢獻(xiàn)者列表數(shù)據(jù)。其中@GET注解描述了這個(gè)請(qǐng)求用了HTTP GET方法。這段demo也闡明了Retrofit路徑參數(shù)替換的功能用法。這個(gè)定義的方法中的{user}路徑將會(huì)被調(diào)用reposForUser方法中的變量值所替換。
```Java
public interface GitHubClient {
@GET("/users/{user}/repos")
Call<List<GitHubRepo>> reposForUser(
@Path("user") String user
);
}```
GitHubRepo類定義。這個(gè)類包含的必須屬性和響應(yīng)數(shù)據(jù)一一對(duì)應(yīng)。
```Java
public class GitHubRepo {
private int id;
private String name;
public GitHubRepo() {
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}```
關(guān)于先前提到的JSON映射:GitHubClient接口定義的返回類型為List<GitHubRepo>的方法。Retrofit 可以確保服務(wù)器響應(yīng)
的數(shù)據(jù)映射的正確性。(就是返回的響應(yīng)數(shù)據(jù)會(huì)和被給的類GitHubRepo的數(shù)據(jù)相對(duì)應(yīng))
##Retrofit REST 客戶端
描述完了API接口和對(duì)象模型之后,我們就可以進(jìn)行真正的請(qǐng)求了。Retrofit的所有請(qǐng)求都是基于1.9或2.0+版本。這兩個(gè)版本你都可以很流暢的創(chuàng)建和配置API。最后,你可以使用builder來對(duì)所有請(qǐng)求設(shè)置一些設(shè)置一些常用的選項(xiàng),比如:url或者轉(zhuǎn)換器。
####Retrofit 2
```Java
String API_BASE_URL = "https://api.github.com/";
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(
GsonConverterFactory.create()
);
Retrofit retrofit =
builder
.client(
httpClient.build()
)
.build();
GitHubClient client = retrofit.create(GitHubClient.class);
}```
上面的demo片段使用了最簡(jiǎn)單的設(shè)置選項(xiàng),還有更多的設(shè)置選項(xiàng)讓你去控制請(qǐng)求。但是這已經(jīng)足夠我們用來作為第一個(gè)請(qǐng)求的列子了。
##JSON 映射
大多數(shù)情況下,請(qǐng)求服務(wù)器和服務(wù)器響應(yīng)返回?cái)?shù)據(jù),都不是用java對(duì)象。更多的是用像JSON這種格式的語言來傳。
當(dāng)使用Retrofit 2,你需要向Retrofit對(duì)象添加一個(gè)轉(zhuǎn)換器,將返回的JSON數(shù)據(jù)轉(zhuǎn)成對(duì)應(yīng)給的類對(duì)象。在build.gradle文件中添加一行下面這個(gè)代碼,引進(jìn)Gson轉(zhuǎn)換器給Retrofit 2用。
```Java
compile 'com.squareup.retrofit2:converter-gson:2.1.0'```
當(dāng)然你也用轉(zhuǎn)換器來轉(zhuǎn)換xml等其他格式的數(shù)據(jù),請(qǐng)參考:
[轉(zhuǎn)換器轉(zhuǎn)換其他格式](https://futurestud.io/tutorials/retrofit-2-introduction-to-multiple-converters "")
##Retrofit 的使用
在大量的準(zhǔn)備工作之后,現(xiàn)在可以很簡(jiǎn)便的請(qǐng)求。只用幾行demo就可以進(jìn)行請(qǐng)求
#### Retrofit 2
使用client去獲取call對(duì)象。只要你用獲取的call對(duì)象調(diào)用.enqueue,請(qǐng)求將會(huì)被Retrofit處理。
```Java
// Create a very simple REST adapter which points the GitHub API endpoint.
GitHubClient client = retrofit.create(GitHubClient.class);
// Fetch a list of the Github repositories.
Call<List<GitHubRepo>> call =
client.reposForUser("fs-opensource");
// Execute the call asynchronously. Get a positive or negative callback.
call.enqueue(new Callback<List<GitHubRepo>>() {
@Override
public void onResponse(Call<List<GitHubRepo>> call, Response<List<GitHubRepo>> response) {
// The network call was a success and we got a response
// TODO: use the repository list and display it
}
@Override
public void onFailure(Call<List<GitHubRepo>> call, Throwable t) {
// the network call was a failure
// TODO: handle error
}
});```
當(dāng)調(diào)用成功之后,Retrofit 會(huì)返回一個(gè)方便的List<GitHubRepo>,你可以使用它顯示在你的app上。
譯至:
[https://futurestud.io/tutorials/retrofit-getting-started-and-android-client](https://futurestud.io/tutorials/retrofit-getting-started-and-android-client"")