Retrofit2

retrofit 是基于 OKhttp 的封装的一个HTTP库

JackWharton 大神又是开发者


使用:

gradle:

    

    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'


第一个依赖是 retrofit 2的 项目,这个很简单,第二三个分别是,当你需要使用 retrofit提供的Gson解析 和 rxjava支持时需要添加这两个依赖





使用:

我们的目标是这个地址 :http://op.juhe.cn/onebox/news/words?key=168b0533eb75d9b0bd675f0ece908ff3


这个地址会返回 json 格式的 新闻列表 数据


首先 建立一个 retrofit对象。


Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://op.juhe.cn")
                .addConverterFactory(GsonConverterFactory.create()) //使用内置gson解析功能
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //使用rxjava
                .build();



然后,我们定义一个我们需要使用的 api 接口


新建一个 interface 就叫 NewsService:


public interface NewsService {
    @GET("/onebox/news//{type}")
    Observable<NEWS> getNews(@Path("type") String type, @Query("key") String  key);
}
其中在这个无结构体的getNews方法中,我们添加了一个注解 @GET(“...”) 


这个注解会告诉retrofit 这是一个get请求  

双引号内的字符串,代表的这个接口在网络中的详细地址。

{} 内的内容 代表了一个占位符

可以看到 第一个 参数 使用了注解@PATH(“”) 这个注解将会将 参数注入到 地址中


我们定义的这个getNews 方法 返回一个Observable 对象  能这样写 是因为 我们使用了 

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())


调用接口:


首先使用 retrofit.create()方法获取一个 实现该接口的实例

然后调用 我们写的方法, 传入 参数,然后就是 rxjava的使用方法了

NewsService newsService = retrofit.create(NewsService.class);
newsService.getNews("words",key)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<NEWS>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(NEWS news) {
                        Log.e("获取到了 新闻列表", "news.size = " + news.getResult().size());
                        for (int i = 0; i < news.getResult().size(); i++) {
                            Log.e("新闻1:",""+news.getResult().get(i)+"/n");
                        }
                    }
                });
这个一个GET 方法的简单实例