>上一篇文章深入浅出Retrofit2.x(一)中,我们讲解了 Retrofit 的最基本用法,以及 GET 请求示例,非常简单,相信大家都已经会使用了,本篇文章将继续介绍 Retrofit 的一些其他的一些常用用法,主要围绕如何使用 POST 请求提交表单数据,提交 json 字符串作为请求体,还有一些 Retrofit 的相关注解介绍等。
## 1.POST 请求我最行
大家在和服务交互的时候,大多情况下都应该使用的是 GET、POST 请求吧,下面我们就对 POST 各种数据类型及如何定义接口进行说明。
### 1.1 POST 提交表单数据
首先定义一个如下接口,如果是单参数或者是双参数的话可以这么写:
1 | @FormUrlEncoded |
如果参数较多的话可以使用 @FieldMap 注解
1 | // 提交 FORM 表单数据 |
另外 @Field 和 @FieldMap 也可以结合在一起使用。
### 1.2 POST 提交 Json 数据
我们大多数情况下,发送 POST 请求都是提交 Json 数据和服务器进行交互,而 Json 数据的序列化方式也有多种,我们可以先把对象序列化成 Json 再提交,也可以直接传入一个 Map 参数集合等等都是可以的,看似我们没有序列化,其实内部已经帮我自动实现了序列化的过程,对于不同的参数类型,我们索性就定义一个比较通用的 ApiService 接口,然后把常用的各种请求方式、文件的上传下载等,以及不同参数类型的方法进行封装,把动态变化的参数暴露给外面,让外部传入即可,接口定义如下,每个方法我都加了注释,看注释就好。
1 | /** |
然后我们先发送一个 POST 请求,是将 json 串作为请求体,接口的参数类型是一个 Map 集合:
1 | Retrofit retrofit = new Retrofit.Builder() |
同样的我们想使用 Post 提交 Form 表单数据,就只需要调用 ApiService 的 postFormData 方法即可,其他不用变,这样做的好处是不用定义多个 Service 了,只需要定义一个 ApiService 就可以满足了所有参数类型的请求了,另外 POST 还可以支持直接传入一个 RequestBody 类型的参数,我们可以直接将对象转换为 RequestBody 对象,然后再请求即可,转化的话我们可以定义一个工具类来实现:
1 | /** |
我们来个请求的示例:
1 | Retrofit retrofit = new Retrofit.Builder() |
## 2.GET 请求之 @Query 和 @QueryMap 注解
@Query 其实相当于我们在请求时 Url 中 ‘?’ 后面的 key-value,例如:
1 | http://api.github.com/?page=1 |
我们就可以这样来定义接口了
1 | @GET("/list") |
这里的 page=1 就是一个 @Query,如果我有多个 @Query,我们可以使用 @QueryMap 使用方法很简单,我就不多说了。
## 3.Retrofit 注解
我们都知道,在 Retrofit 中,大量使用了注解,这样做的好处是可以简化请求,通过各种不同的注解来进行灵活的配置,另外也可以达到解耦的目的,所以说 Retrofit 的设计很美很优雅, Retrofit 的注解大体分为以下几类:
1. 用于标注请求方式的注解;
2. 用于标记请求头的注解;
3. 用于标记请求参数的注解;
4. 用于标记请求和响应格式的注解;
### 3.1 请求方法注解
|注解|说明|
| —— | —— |
|@GET|GET 请求|
|@POST|POST 请求|
|@PUT|PUT 请求|
|@DELETE|DELETE 请求|
|@PATCH|PATCH 请求,对 PUT 请求的补充,用于更新局部资源|
|@HEAD|HEAD 请求|
|@OPTION|OPTION 请求|
|@HTTP|通用注解,可以替换以上所有的注解,其拥有三个属性:method、path、hasBody|
### 3.2 请求头注解
|注解|说明|
| —— | —— |
|@Headers|添加固定请求头,可以同时添加多个并且不会相互覆盖原有的请求头,而是共同存在|
|@Header|作为方法的参数传入,用于添加不固定值的 Header,该注解会更新覆盖已有的请求头|
### 3.3 请求参数注解
|注解|说明|
| —— | —— |
|@Body|多用于 POST 请求发送非表单数据,比如想要以 POST 方式传递 json 格式数据|
|@Filed|多用于 POST 请求中表单字段,@Filed 和 @FieldMap 需要与 @FormUrlEncoded 注解结合使用|
|@FiledMap|和 @Filed 作用一致,用于不确定表单参数|
|@Part|用于表单字段,@Part 和 @PartMap 与 @Multipart 注解结合使用,适合文件上传的情况|
|@PartMap|用于表单字段,默认接受的类型是 Map,可用于实现多文件上传|
|@Path|用于 url 中的占位符|
|@Query|用于 GET 请求的 url 中指定 key=value 参数|
|@QueryMap|和 @Query 使用类似|
|@Url|指定请求路径,可以是全路径和相对路径|
### 3.4 请求和响应格式注解
|注解|说明|
| —— | —— |
|@FormUrlEncoded|表示请求发送编码表单数据,每个键值对需要使用 @Field 注解|
|@Multipart|表示请求发送 Multipart 数据,需要配合使用 @Part|
|@Streaming|表示响应用字节流的形式返回,如果没使用该注解,默认会把数据全部载入到内存中,该注解在在下载大文件的特别有用|
好了,前两篇的分享已经完了,主要是围绕 Retrofit 最常用最基本的用法来展开讲解的,相信大部分读者看完都已经会用了,大家可能已经看出来这样的代码还是不太好用,没有一些设计的思想,代码比较冗余,下一篇文章将开始讲解如何进行封装一个通用的 Retrofit,这样我们就可以进行方便的进行使用了,提高了代码的复用性和封装性,以及通用性,敬请期待吧!
猜你喜欢:
给大家推荐一个神器
深入浅出Retrofit2.x(一)
不得不会的10点Java基础知识
Android 最全 Intent 传递数据姿势