一步步结合实例学习retrofit2

来源:互联网 发布:美工自学多久能自己做 编辑:程序博客网 时间:2024/06/03 03:22

retrofit实际上就是对gson和okhttp进行了结合封装。一般来说,我们需要发送网络请求,然后处理返回的数据。而通过retrofit,可以快速简洁的完成这一系列操作,一般还要结合RxJava,让整个过程更加优雅。


准备工作:

    compile 'com.squareup.retrofit2:retrofit:2.1.0'    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
在gradle中加入这两个库,第二个用于将相应数据转换成我们需要的数据类型。converter(转换器)

推荐使用插件GsonFormat,建立数据模型类文件后使用快捷键alt+s,将json字符串输入就可以快速生成相应的json数据类。


1.最简单的网络访问:

首先来回顾一下如何使用okhttp进行一次网络访问:

        Request request=new Request.Builder()                .url(url)                .build();        Call call=client.newCall(request);//将请求封装成任务        call.enqueue...
需要新建request,然后使用onHttpClient和request生成Call,然后执行这个Call的任务。基本上每次网络访问都要重复这个过程,当然,我们可以自己把这个封装一下。

接下来看看retrofit封装后如何进行网络访问:


首先新建一个接口,然后在接口里定义方法,以后所有的网络请求方法也都放在这个接口里:

    @GET("course/courseRelease_list")    Call<ResponceBody> getCourse();
这里的注解明显就是指定访问方式了,括号里的参数要结合BaseUrl生成完整的Url。可以发现,这里的Call类具有了泛型。这个类型的意义我们暂时不去考虑,就使用这个ResponceBody。

然后就开始使用了:

Retrofit retrofit=new Retrofit.Builder()                .baseUrl(BASE_URL)                .build();        AppUrl appUrl=retrofit.create(AppUrl.class);        Call<ResponseBody> call=appUrl.getCourse2(3,1);        call.enqueue(new Callback<ResponseBody>() {            @Override            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {                            }            @Override            public void onFailure(Call<ResponseBody> call, Throwable t) {            }        });
首先使用BaseUrl实例化Retrofit对象,BaseUrl其实就是URL前面那段不变的部分,他和上面GET后面的url拼接成最后的url。然后使用这个对象实例化接口,调用接口方法生成Call对象。

到这一步,接下来就和okhttp差不多了,进行同步或异步执行,异步时写回调接口。

onResponse中获得的response.body这里是一个ResponseBody对象。


2.请求拼接部分API:

(1)使用GET与POST指定访问方式,后面的参数拼接在BaseUrl后。

(2)使用Path替换掉URL中的动态部分:

    @GET("{name}")    Call<ResponceBody> get(@Path("name") String urlName);
这里方法传入的参数urlName就会替换掉Url中花括号里的name,注解后面的参数与替换名保持一致,但是不能用这个来发送参数,发送参数可以用Query

(3)使用Query为GET添加参数:

    @GET("course/courseRelease_list")    Call<TestBean> getCourse2(@Query("pageIndex") int pageIndex, @Query("courseType") int courseType);
注解后面的参数表示key,传入的是value。

(4)使用FormUrlEncoded和Field提交表单:

要提交表单就给方法加上@FormUrlEncoded注解,Field的使用方式和Query一样:

@FormUrlEncoded@POST("user/login")Call<User> updateUser(@Field("username") String name, @Field("password") String pass);
(5)使用Body在请求体中添加json:

 @POST("aaa") Call<MBean> send( @Body UserInfo body);
可以直接传对象,借助底层的gson可以完成对象和json的简单转化。


3.自动转换器:

至此还无法看出retrofit的强大之处,其一大优势在于简单的把返回的数据直接转换成我们制定的类型。

首先要为retrofit对象添加转换器:

Retrofit retrofit=new Retrofit.Builder()                .baseUrl(BASE_URL)                .addConverterFactory(GsonConverterFactory.create())                .build();

把接口中方法的泛型改成我们需要的数据类型,然后这样使用:

    call.enqueue(new Callback<TestBean>() {            @Override            public void onResponse(Call<TestBean> call, Response<TestBean> response) {                TestBean bean=response.body();            }

可以看到,response.body直接返回了一个我们需要的类型的对象,retrofit帮我们进行了转换。

虽然我们都知道这是gson的强大,但是挺神奇的。

转换数组:

Type listType = new TypeToken<List<PostItem>>() {}.getType();        List<PostItem> list1 = new Gson().fromJson(item.getContent(), listType);

开发中遇到的一个问题是,如果对象的一个字段是一个json对象或数组,那么就不能将其转换成字符串。


4.与RxJava结合使用:

retrofit提供了与rxjava完美结合的方法:接口中的方法可以直接返回被观察者。

首先要添加和rxjava有关的转换器:

Retrofit retrofit = new Retrofit.Builder()      .baseUrl("http://www.BaseURL.com/")      .addConverterFactory(GsonConverterFactory.create())//自动通过Gson转josn,上面有提到      .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加RxJava支持      .build();
然后定义方法:

@GET("aaa") Observable<MBean> get();

泛型还是需要的结果数据类型。

url.get()        .subscribeOn(Schedulers.io())        .subscribe(new Subscriber<MBean>() {            @Override            public void onCompleted() {            }            @Override            public void onError(Throwable e) {            }            @Override            public void onNext(MBean mBean) {            }        });

使用起来非常方便,可以发现,被观察者调用观察者方法发送数据的过程也被封装了,简直666.





原创粉丝点击