文章目录
一.导图
Retrofit 共22个注解,根据功能大概分为三类:
二.请求方法类
请求方法类共8个注解。
1.除@HTTP外其他7个:
- 均对应http的请求方法;
- 均接收一个字符串表示接口 path ,与 baseUrl 组成完整的 Url:baseUrl+path;
- path 中可以使用变量,如 {id} ,并使用 @Path(“id”) 注解为 {id} 提供值。
- 当注解的path为全路径时(可能和baseUrl不是一个域),会直接使用注解的path的域。
示例:
public interface BlogService{
@GET("http://www.csdn.net/blog/{id}")
Call<ResponseBody> getBlog(@Path("id") int id);
}
2.@HTTP
- 可用于替代以上 7 个,及其他扩展方法;
- 有 3 个属性:method、path、hasBody。
例如:
@HTTP(method = "get", path = "blog/{id}", hasBody = false)
Call<ResponseBody> getBlog(@Path("id") int id);
三.参数类
1.Headers
作用于方法(即写在方法的上面),用于添加请求头。
2.Header
作用于参数(即写在参数前),用于添加不固定的 Header。
3.Body
非表单请求体,例如在多个参数时可以封装到一个Model中,@Body作用于此Model。
4.Field
表单字段,@Field主要用于Post请求数据。FormUrlEncoded (下文介绍)配合。如果不添加@FormUrlEncoded
会报错:@Field parameters can only be used with form encoding。
5.FieldMap
表单字段,与FormUrlEncoded 配合;接受 Map<String, String> 类型,非 String 类型会调用
toString() 方法。
6.Part
表单字段,适合文件上传情况。
7.PartMap
表单字段,适合文件上传情况;默认接受 Map<String, RequestBody> 类型,非 RequestBody 会通过
Converter 转换。
8.Path
用于给请求url中占位符赋值。使用@Path时,path对应的路径不能包含”/”,否则会将其转化为%2F。
9.Query
主要用于Get请求数据,用于拼接在拼接在Url路径后面的查询参数,一个@Query相当于拼接一个参数,多个参数中间用,隔开。 示例:
@GET("api/ask/all_questions") Call<List<Repo>> getData(@Query("page") int page, @Query("is_reward") int is_reward); }
10.QueryMap
主要用于Get请求数据,用于拼接在拼接在Url路径后面的查询参数。
11.Url
@Url是动态的Url请求数据的注解。 示例:
@GET Call<List<Repo>> getData(@Url String user);
注意事项:
- 如果请求为post实现,那么最好传递参数时使用@Field、@FieldMap和@FormUrlEncoded。因为@Query和或QueryMap都是将参数拼接在url后面的,而@Field或@FieldMap传递的参数时放在请求体的。
- 使用@Path时,path对应的路径不能包含”/”,否则会将其转化为%2F。在遇到想动态的拼接多节url时,还是使用@Url吧。
- @Body标签不能同时和@FormUrlEncoded、@Multipart标签同时使用。否则会报错:@Body parameters cannot be used with form or multi-part encoding.
四.标记类
1.FormUrlEncoded
请求体是 From 表单。
post请求中使用@Field和@FieldMap时要添加此注解,否则会抛出Java.lang.IllegalArgumentException:
@Field parameters can only be used with form encoding. 的错误。
2.Multipart
请求体是支持文件上传的 From 表单。
3.Streaming
响应体的数据用流的形式返回。未使用该注解,默认会把数据全部载入内存,之后通过流获取数据也是读取内存中数据,所以返回数据较大时,需要使用该注解。
传送另一篇:Retrofit 请求失败问题填坑记录