前言
Retrofit2.x 已经是大家通用的网络通讯框架了。最近由于对网络层在进行优化,顺便将 Retrofit 相关注解也再看了下。Retrofit 请求参数注解比较多,而我们平时的开发过程中不会都用到,为了方便以后使用,在此既作复习也做记录吧。
今天涉及的内容:
- 注解使用前置
- 注解分类
- 常用请求方法的使用
- 标记类注解的使用
- 参数类注解的使用
5.1 简单的get请求
5.2 动态url请求
5.3 URL中带有参数的get请求
5.4 参数在url问号之后的请求
5.5 post请求一个固定的url(以表单方式传一个参数)
5.6 post请求一个固定的url(以表单方式传多个参数)
5.7 post请求url路径中间含参,url问号之后含参(以表单方式传一个参数)
5.8 post请求传一个对象
5.9 上传文件
5.10 设置固定的请求头
5.11 设置动态的请求头 - 总结
- 参考文章
一.注解使用前置
一般我们的 “请求参数注解” 都是在自建的 java 接口内进行,类似如下:
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
我们自己新建了网络接口通讯类GitHubService 后,就可以再这里面写通讯相关接口了,这时,就会涉及到 “请求参数注解”的问题。
二.注解分类
共22个注解,根据功能大概分为三类:
- 请求方法类
GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、HTTP
- 标记类
FormUrlEncoded、Multipart、Streaming
- 参数类
Headers、Header、Body、Field、FieldMap、Part、PartMap、Query、QueryMap、Path、URL
三.常用请求方法的使用
8 个 请求方法类 分别对应 HTTP 的请求方法;(HTTP除外)。在 8个请求方法中,HTTP 可用于替代以上 7 个,及其他扩展方法;
有 3 个属性:method、path、hasBody
下面是一个用 HTTP 请求的例子:
public interface BlogService{
/**
* method 请求方法,不区分大小写
* path 路径
* hasBody 是否有请求体
*/
@HTTP(method = "get", path = "new/{id}", hasBody = false)
Call<ResponseBody> getNew(@Path("id") int id);
}
但是在一般的开发过程中,我们经常用到的请求方法就两个:POST,GET。
你可以像下面这样发起一个简单的 GET 请求:
//简单的get请求(没有参数)
@GET("trades")
Call<TradesBean> getItem();
要发起一个 post请求,你可以类似这样写:
@POST("users/new")
Call<User> createUser(@Body User user);
四. 标记类注解的使用
表单请求,用:
FormUrlEncoded 和 Multipart
标记用:
Streaming
FormUrlEncoded
请求体是 From 表单
Content-Type:application/x-www-form-urlencoded
Multipart
请求体是支持文件上传的 From 表单
#上传文件使用:Content-Type:multipart/form-data
//传单个文件
@Multipart
@POST("v1/create")
Call<ResponseBody> create(@Part("pictureName") RequestBody pictureName, @Part MultipartBody.Part picture)
RequestBody pictureNameBody = RequestBody.create(MediaType.parse(AppConstants.CONTENT_TYPE_FILE), "pictureName");
File picture= new File(path);
RequestBody requestFile = RequestBody.create(MediaType.parse(AppConstants.CONTENT_TYPE_FILE), picture);
// MultipartBody.Part is used to send also the actual file name
MultipartBody.Part picturePart = MultipartBody.Part.createFormData("picture", picture.getName(), requestFile);
//调接口
create(pictureNameBody, picturePart);
//传多个文件
@Multipart
@POST("v1/create")
Call<ResponseBody> create(@Part("pictureName") RequestBody pictureName, @PartMap Map<String, RequestBody> map)
RequestBody pictureNameBody = RequestBody.create(MediaType.parse(AppConstants.CONTENT_TYPE_FILE), "pictureName");
File picture= new File(path);
RequestBody requestFile = RequestBody.create(MediaType.parse(AppConstants.CONTENT_TYPE_FILE), picture);
Map<String, RequestBody> params = new HashMap<>();
params.put("picture\"; filename=\"" + picture.getName() + "", requestFile);
//调接口
create(pictureNameBody, params);
Streaming
响应体的数据用流的形式返回
未使用该注解,默认会把数据全部载入内存,之后通过流获取数据也是读取内存中数据,所以返回数据较大时,需要使用该注解。
五.参数类注解的使用
下面将以通讯接口的方式讲解,然后覆盖到相关参数注解。