Retrofit是Square公司專為Android和Java設(shè)計的一個類型安全的REST客戶端。它幫助你輕松地與任意REST API交互,并完美兼容RxJava:所有的JSON響應(yīng)對象都被映射成原始的Java對象,并且所有的網(wǎng)絡(luò)調(diào)用都基于Rxjava Observable這些對象。
使用API文檔,我們可以定義我們從服務(wù)器接收的JSON響應(yīng)數(shù)據(jù)。為了很容易的將JSON響應(yīng)數(shù)據(jù)映射為我們的Java代碼,我們將使用jsonschema2pojo, 這個服務(wù)將靈活地生成所有與JSON響應(yīng)數(shù)據(jù)相映射的Java類。
當我們把所有的Java model準備好后,我們就可以開始建立Retrofit。Retrofi使用標準的Java接口來映射API路由。例如例子中,我們將使用來自API的一個路由,下面是我們Retrofit的接口:
public interface StackExchangeService {
@GET("/2.2/users?order=desc&sort=reputation&site=stackoverflow")
Observable<User sResponse> getMostPopularSOusers(@Query("pagesize") int howmany);
}
interface接口只包含一個方法,即getMostPopularSOusers。這個方法用整型howmany作為一個參數(shù)并返回UserResponse的Observable。
當我們有了interface,我們可以創(chuàng)建RestAdapter類,為了更清楚的組織我們的代碼,我們創(chuàng)建一個SeApiManager函數(shù)提供一種更適當?shù)姆绞絹砗蚐tackExchange API交互。
public class SeApiManager {
private final StackExchangeService mStackExchangeService;
public SeApiManager() {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("https://api.stackexchange.com")
.setLogLevel(RestAdapter.LogLevel.BASIC)
.build();
mStackExchangeService = restAdapter.create(StackExchangeService.class);
}
public Observable<List<User>> getMostPopularSOusers(int howmany) {
return mStackExchangeService
.getMostPopularSOusers(howmany)
.map(UsersResponse::getUsers)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
為了簡化例子,我們不再將這個類設(shè)計為它本該設(shè)計成的單例。使用依賴注入解決方案,如Dagger2,可使代碼質(zhì)量更高。
創(chuàng)建RestAdapter類,需要對客戶端API設(shè)置幾個重要的方面。這個例子中,我們設(shè)置了endpoint和log level。由于這個例子中URL只是硬編碼,像這樣使用外部資源來存儲數(shù)據(jù)很重要。避免在代碼中硬編碼字符串是一個好的實踐。
Retrofit把RestAdapter類和我們的API接口綁定在一起后就完成了創(chuàng)建。它返回給我們一個對象用來請求API。我們可以選擇直接暴露這個對象,或者以某種封裝方式來限制對它的訪問。在這個例子中,我們封裝它并只暴露getMostPopularSOusers方法。這個方法執(zhí)行查詢,使用Retrofit解析JSON響應(yīng)數(shù)據(jù)。獲得用戶列表,并返回給訂閱者。如你所見,使用Retrofit、RxJava和Retrolambda,我們幾乎沒有模板代碼:它非常緊湊而且可讀性很高。
現(xiàn)在,我們已經(jīng)有一個API管理者來提供一個響應(yīng)式的方法,它從遠程API獲取數(shù)據(jù)并給I/O調(diào)度器,解析映射最后為我們的消費者提供一個簡潔的用戶列表。