Retrofit2+okHttp3使用样例

在这里为大家介绍下Retrofit2+okHttp3这个目前较为流行网络框架的使用过程,gradle添加依赖过程不再叙述,这里只介绍请求,文件的上传下载本篇不表。

本文针对的读者群体为没使用过Retrofit于okHttp的开发人员,老司机可以直接拉到评论区,为新手指点迷津。

闲话少叙,直接上步骤:

retrofit在使用前要定义一个接口,在接口中根据需求,以注解方式写方法,下面简单写一个get请求:

  • public interface HttpInterface
    {
        @GET("splash")
        Call<ResponseBody> getSplashUrl();
    }

大家可以看到,我定义了一个方法,getSplashUrl,这里咱们把他理解为获取闪屏页面图片地址的方法,通过@GET注解,表示为该请求为GET请求,注解后面的value,也就是“splash”,是部分url,为什么说是部分呢,因为它要和Retrofit配置对象时填写的baseUrl组成完整url,baseUrl我们稍后叙述。这里介绍下请求方式注解,常用的有@POST和@GET,根据字面意思很好理解,是post请求和get请求。说到这里,咱们要说一下向后台提交参数的方法。先说下通过Url动态传参。


public interface HttpInterface
{
    @GET("user/{userid}")
    Call<ResponseBody> getUser(@Path("userid") String userid);
}


大家将上面代码理解为一个获取用户详情的接口,说下上面代码段的关键点 ,大家应该注意到了,@GET注解后的value中,有一对大括号,{userid},在这里,这对大括号相当于占位符,与方法中@Path注解后的value相对应,@Path注解后紧跟着一个一个参数,使我们要动态组合url时需要的参数。调用以上方法,传入相应的用户id,即可组成如下的url地址: http://xxxxxxxx/user/userid,从而达到直接访问相应url获取用户信息的目的。


接下来讲解下Post传参方式,目前我接触到的有两种,一种是查询参数,也就是一般的传参,另一种是表单传参,先说下查询传参,不多说,上例子。

<pre name="code" class="java">public interface HttpInterface
{
    @POST("users")
    Call<ResponseBody> getUser(@Query("userid") String userid);
}

 

老规矩,说几个关键点,@Query注解,这个注解是添加参数用的,注解的value是参数名,这个要和后台统一,后面紧跟的参数动态传入的参数值,利用此方法,可以达到向后台提交参数userid,获取用户详情的目的。

再说下表单传参,不多说,上代码。

public interface HttpInterface
{
    @POST("users")
    @FormUrlEncoded
    Call<ResponseBody> getUser(@Field("userid") String userid);
}

关键点,大家可能已经注意到,在@POST注解下,又加入了 @FormUrlEncoded注解,加入该注解,表示以表单的形式向后台传入键值对参数。与@Query同理,在表单传参时替换为@Field,作用相同。

下面再说一种传参方式,也是开发中较为常用的方式,讲Json字符串以Body的形式提交到后台。(我发现我前面有个字打错了,但是我不想改- -)这种请求方式怎么做呢,不多说,上代码 ,代码直观。

public interface HttpInterface {

    @POST("user_login")
    Call<String> login(@Body RequestBody body);
    
}

这里注意下方法参数中的注解@Body 表示将参数添加到请求体body中,提交到服务器,特别注意下注解后的参数 是一个RequestBody,稍后会说到。


-------------------------------分割线,我就不放中间,逼死强迫症--------------------------------------------------------------------------------------------------------------------------------------------------------

上面说完了请求接口的常用书写方式,下面介绍下Retrofit的配置以及调用

先说配置,上代码。

 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://xxx/xxx")
                .addConverterFactory(YourConverter.create())
                .client(OkHttpClient)
                .build();

讲一下几个参数,第一个baseUrl,这个参数是我们请求接口的根目录,与请求接口中注解后的value组成完整Url,第二个参数是转换器,用于将请求结果转换为我们需要的数据格式,常用的有如下几种:


  • Gsoncom.squareup.retrofit2:converter-gson
  • Jacksoncom.squareup.retrofit2:converter-jackson
  • Moshicom.squareup.retrofit2:converter-moshi
  • Protobufcom.squareup.retrofit2:converter-protobuf
  • Wirecom.squareup.retrofit2:converter-wire
  • Simple XMLcom.squareup.retrofit2:converter-simplexml
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

以上摘自squareup官网,大家可能注意到,我前面写的实例中,请求方法返回值为Call类型,泛型为<ResponseBody>,这个类型是默认类型,也就是在构造时没有添加转换器默认返回的类型,请求回来的内容为服务器返回结果body中的内容,如需要返回自定义的javabean对象,可添加相应的转换器,例如Gson、Jackson等。

第三个参数是设置okhttp的Client。虽然retrofit2之后用的是ok内核,但是有的时候我们还是需要配置,因为大多数情况下我们需要查看网络请求日志,以及配置缓存大小,缓存目录等内容。


下面到了重头戏,如何发起请求。看代码

        HttpInterface service = retrofit.create(HttpInterface.class);

这里我们创建了一个接口对象service,固定写法,不解释。然后如下
Call<ResponseBody> call = service.getUser(userid);
创建一个Call对象,并以接口方法返回值赋值。继续往下看。

 call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                 
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
               
            }
        });

看到这大家可能比较熟悉了,这里就很像以往常用的网络框架的结构了。call对象调用了enqueue方法,传入了一个回调对象,实现对网络请求成功与失败的状态监听与事件处理,这里说一下,enqueue是异步请求,同步请自行百度,用法相同。


啰里啰嗦,简单介绍了一下Retrofi+okHttp用法,我也是最近才使用此框架,如有错误,望指正。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值