Retrofit(一)

2020-06-17  本文已影响0人  涛涛123759

随着Google对HttpClient的摒弃,和Volley的逐渐没落,OkHttp开始异军突起,Retrofit对OkHttp进行了强制依赖。Retrofit是由Square公司出品的针对于Android和Java的类型安全的Http客户端,如果看源码会发现其实本质上是OkHttp的封装,使用面向接口的方式进行网络请求,利用动态生成的代理类封装了网络接口请求的底层,其将请求返回JavaBean,对网络认证REST API进行了很友好的支持。retrofit是基于RESTful架构,使用Retrofit将会极大的提高我们应用的网络体验。

在gradle里面添加导入retrofit

    implementation  'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

一、参数注解

1、@Query:作用于方法参数,用于添加查询参数,即请求参数
@GET("/list")
Call<ResponseBody> list(@Query("page") int page);
@GET("/list")
Call<ResponseBody> list(@Query("category") String category);
//传入一个数组
@GET("/list")
Call<ResponseBody> list(@Query("category") String... categories);
//不进行URL编码
@GET("/search")
Call<ResponseBody> list(@Query(value="foo", encoded=true) String foo);
2、@QueryMap:作用于方法的参数
//使用默认URL编码
@GET("/search")
Call<ResponseBody> list(@QueryMap Map<String, String> filters);
//不使用默认URL编码
@GET("/search")
Call<ResponseBody> list(@QueryMap(encoded=true) Map<String, String> filters);
3、@Body:作用于方法参数

使用@Body 注解定义的参数不能为null。
当你发送一个post或put请求,但是又不想作为请求参数或表单的方式发送请求时,使用该注解定义的参数可以直接传入一个实体类,retrofit会通过convert把该实体序列化并将序列化的结果直接作为请求体发送出去。

   public class Repo {
    private String owner;
    private String name;
    Repo(String owner, String name) {
      this.owner = owner;
      this.name = name;
    }
  }
    @POST("/")
    Call<ResponseBody> sendNormal(@Body Repo repo);
4、@Field:作用于方法的参数

用String.valueOf()把参数值转换为String,然后践行URL编码,当参数值为null是=时,会自动忽略,如果传入的是一个List或者array,则为每一个非空的item拼接一个键值对,每一个键值对中的键是相同的,值就是非空的item的值。如:name=张三&name=李四&name=王五,如果itme的值有空格,在拼接的时候会自动忽略,例如某个item的值为:张 三,则拼接后为name=张三。

//普通参数
@FormUrlEncoded
@POST("/")
Call<ResponseBody> example(@Field("name") String name,@Field("occupation") String occupation);

//固定或可变数组
@FormUrlEncoded
@POST("/list")
Call<ResponseBody> example(@Field("name") String... names);
5、@FieldMap:作用于方法的参数

map中的每一项的键和值都不能为空,否则抛出IllegalArgumentException异常。

@FormUrlEncoded
@POST("/things")
Call<ResponseBody> things(@FieldMap Map<String, String> fields);
6、@Part:作用于方法的参数,用于定义Multipart请求的每和part

使用该注解定义的参数,参数值可以为空,为空时,则忽略。

@Multipart
@POST("/")
Call<ResponseBody> example(
       @Part("description") String description,
       @Part(value = "image", encoding = "8-bit") RequestBody image);
7、@PartMap:作用于方法的参数

以map的方式定义Multipart请求的每个part map中每一项的键和值都不能为空,否则抛出IllegalArgumentException异常。

8、@Header:作用于方法的参数,用于添加请求头

使用 @Header 注解 定义的请求头可以为空,当为空时,会自动忽略,当传入一个List或者array时,为拼接每个非空的item的值到请求头中。
具有相同名称的请求头不会相互覆盖,而是照样添加到请求头中

@GET("/")
Call<ResponseBody> foo(@Header("Accept-Language") String lang);
9、@Headers:作用于方法,用于添加一个或多个请求头中

具有相同名称的请求头不会相互覆盖,而是会照样添加到请求头中。

//添加一个请求头
 @Headers("Cache-Control: max-age=640000")
 @GET("/")

//添加多个请求头
@Headers({ "X-Foo: Bar", "X-Ping: Pong"})
@GET("/")
10、@Url: 作用于方法参数

用于添加请求的 接口地址

@GET
Call<ResponseBody> list(@Url String url);

二、(Content-Type)标记注解

1、@FormUrlEncoded:用于修饰Filed注解 和FileldMap注解

使用该注解,表示请求正文将使用表单网址编码。字段应该声明为参数,并用@Field注解和 @FieldMap注解,使用@FormUrlEncoded 注解的请求将具有application/x-www-form-urlencoded MIME类型。字段名称和值将先进行UTF-8进行编码,再根据RFC-3986进行URI编码。

2、@Multipart:作用于方法

使用该注解,表示请求体是多部分的,每个部分作为一个参数,且用Part注解声明。

3、@Streaming:作用于方法

未使用@Straming 注解,默认会把数据全部载入内存,之后通过流获取数据也是读取内存中数据,所以返回数据较大时,需要使用该注解。
处理返回Response的方法的响应体,用于下载大文件。

@Streaming
@GET
Call<ResponseBody> downloadFileWithDynamicUrlAsync(@Url String fileUrl)

三、注意事项:

上一篇 下一篇

猜你喜欢

热点阅读