首先添加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);