在这里为大家介绍下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);
}
接下来讲解下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,第二个参数是转换器,用于将请求结果转换为我们需要的数据格式,常用的有如下几种:
- Gson:
com.squareup.retrofit2:converter-gson
- Jackson:
com.squareup.retrofit2:converter-jackson
- Moshi:
com.squareup.retrofit2:converter-moshi
- Protobuf:
com.squareup.retrofit2:converter-protobuf
- Wire:
com.squareup.retrofit2:converter-wire
- Simple XML:
com.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用法,我也是最近才使用此框架,如有错误,望指正。