首先添加Retrofit依賴
compile 'com.squareup.retrofit2:retrofit:2.1.0'
Retrofit通過接口來管理HTTP API,那麼首先我們先定義一個API的接口:
public interface ZhihuApi {
@GET("/api/4/news/latest")//GET方法這裏可以換成不同的HTTP請求
Observable<ZhihuDaily> getLastDaily();
}
然後通過Retrofit.Builder獲取到Retrofit實例,並通過create(class)方法獲取到我們剛纔創建的RetrofitApi接口實例:
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("http://news-at.zhihu.com")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitApi retrofitApi=retrofit.create(ZhihuApi.class);
.addConverterFactory
方法添加相應結果解析器,存放於Retrofit.Builder類的converterFactories集合中。從Builder的構造方法可以看出創建Builder的時候會自動添加一個默認的ConvertFactory。
addCallAdapterFactory
方法添加訪問處理適配器,存放於Retrofit.Builder類的adapterFactories集合中。
得到實例後就可以使用了
subscription= ZhihuManager.getInstance()
.getZhihuApiService()
.getLastDaily()
.subscribeOn(Schedulers.io())//指定Observable事件產生和變換處理的線程
.observeOn(AndroidSchedulers.mainThread())//指定訂閱者所在的線程
.subscribe(new Subscriber<ZhihuDaily>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(ZhihuDaily daily) {
//get first bean
ZhihuDailyItem item=daily.getStories().get(0);
printLog("Title:"+item.getTitle());
printLog("Data: "+item.getDate());
printLog("Id: "+item.getId());
printLog("Type: "+item.getType());
}
});
上述接口中的@GET註解也可以是其他的HTTP請求;比如GET,POST,PUT,DELETE,HEAD,PATCH,OPTIONS,HTTP七種請求方法
Retrofit中的標記類註解
Retrofit支持三種標記類註解,分別是:FormUrlEncoded、Multipart、Streaming。
- FormUrlEncoded 指請求體是一個Form表單,Content-Type=application/x-www-form-urlencoded,需要和參數類註解@Field,@FieldMap搭配使用
- Multipart 指請求體是一個支持文件上傳的Form表單,Content-Type=multipart/form-data,需要和參數類註解@Part,@PartMap搭配使用
- Streaming 指響應體的數據以流的形式返回,如果不使用默認會把數據全部加載到內存,所以下載文件時需要加上這個註解
參數類註解
-Headers:添加請求頭,作用於方法
@Headers("Cache-Control: max-age=640000")
@GET("/api/4/news/latest")
Observable<ZhihuDaily> getLastDaily();
-Header:用於動態添加頭部,作用於方法參數
@Headers("Cache-Control: max-age=640000")
@GET("/api/4/news/latest")
Observable<ZhihuDaily> getLastDaily(@Header("Token") String token);
-Body:用於非表單請求體,作用於方法參數
@GET("/api/4/news/latest")
Observable<ZhihuDaily> getLastDaily(@Body User user);