一步步结合实例学习retrofit2

本文详细介绍了如何使用Retrofit2进行网络请求,包括基本的网络访问、请求参数处理、自动转换器的使用以及与RxJava的结合。通过实例展示了Retrofit2如何简化网络操作,使得数据转换更为便捷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值