.
一、前言
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,底层是OKHttp,可以处理GET、POST、PUT、DELETE等请求,还可以使用Picasso加载图片。
二、注解
1.网络请求方法
@POST、@GET、@PUT、@DELETE全都是http中网络请求方式,@HTTP可以替换@POST、@GET、@PUT、@DELETE注解及更多功能,具体使用如下:
public interface RerofitService{
/**
*method:网络请求方法
*path:网络请求地址
*hasBody:是否有请求体
*/
@HTTP(method="POST", path="blog/", hasBody= false)
Call getUserInfo(@Path("id") int id);
}
2.标记类
@FormUrlEncoded:表示发送form-encoded表单数据,每个键值需要用 @Field来注释key名,随后的对象需要提供值,即value,如果多个键值对用注解@FieldMap。(@FormUrlEncoded和@Field或和@FieldMap成对出现,即配合使用)
如:登录页面使用:Content-Type:application/x-www-form-urlencoded。
@Multipart:表示发送form-encoded表单数据,适用于文件上传,每个键值需用@Part注解注释key名,随后对象提供键值value,多个文件上传用注解@PartMap。(@Multipart与@Part或@PartMap配合使用)
如:上传文件使用:Content-Type:multipart/form-data。
@Screaming:表示返回数据以流的形式返回,适用于返回数据较大的场景。如果微使用该注解,默认会把数据全部载入内存,之后取数据从内存中获取。
3.网络请求参数
@Headers:添加请求头,请求头固定,请求头不会相互覆盖
public interface RetrofitService{
/**
*content-type: 传输数据类型为json
*/
@Headers("Content-type: application/json")
@POST("blog/")
Call getUserInfo();
/**
*Content-type: 请求数据类型为json
*Accept:接收数据类型为json
*Connection:网络连接类型,keep-alive为长链接,close为短链接
*/
@Headers({"Content-type: application/json", "Accept: application/json", "Connection: keep-alive"})
@POST("blog/")
Call getUserInfo();
}
@Header:动态更新请求头,匹配的参数必须提供给 @Header ,若参数值为 null ,这个头会被省略,否则,会使用参数值的 toString 方法的返回值。
public interface RetrofitService{
@POST("user/getUser")
Call getUserInfo(@Header("Authorization") String authorization);
}
@Path:用于替换Url中地址缺省值
public interface RetrofitService{
@POST("user/{id}")
Call getUserInfo(@Path("id") String id);
}
@Url:用于请求地址url设置
public interface RetrofitService{
@POST
Call getUserInfo(@Url String url);
}
@Body:用于post请求发送非表单数据,会把我们传入的实体类转换为用于传输的HTTP请求体
public interface RetrofitService{
@POST("user/getUser")
Call getUserInfo(@Body User user);
}
@Query & @QueryMap:用于在url后拼接上参数
@GET("book/search")
Call getSearchBook(@Query("q") String name);//name由调用者传入
相当于:
@GET("book/search?q=name")
Call getSearchBook();
@Field & FieldMap:发送 Post请求 时提交请求的表单字段,与 @FormUrlEncoded 注解配合使用
public interface RetrofitService{
@FormUrlEncoded
@POST("user/getUser")
Call getUserInfo(@Field("name") String name, @Field("idCard") String idCard);
@FormUrlEncoded
@POST("user/getUser")
Call getUserInfo(@FieldMap Map userMap);
}
@Part & @PartMap:发送 Post请求 时提交请求的表单字段,与 @Multipart 注解配合使用,适用于上传文件
public interface RetrofitService{
/**
*Part后面支持三种类型,RequestBody、okhttp3.MultipartBody.Part、任意类型
* 除okhttp3.MultipartBody.Part 以外,其它类型都必须带上表单字段中已经包含了表单字段的信息
*/
@Multipart
@POST("user/getUser")
Call getUserInfo(@Part("name") RequestBody name, @Part MultipartBody.part file);
/**
*PartMap 注解支持一个Map作为参数,支持 {@link RequestBody } 类型,
* 如果有其它的类型,会被retrofit2.Converter转换,
*/
@Multipart
@POST("user/getUser")
Call getUserInfo(@PartMap Map userMap);
}
三、创建Retrofit发送网络请求
1.创建retrofit
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())//json转换器
.baseUrl("https://api.douban.com/v2/")
.build();
2.定义Http Api请求接口
public interface RetrofitService{
@POST("book/search")
Call getBookInfo(@Query("name") String name);
}
3.创建请求接口实例
RetrofitService retrofirService = retrofit.create(RetrofitService.class);
4.用接口实例创建请求
Call call = retrofirService.getBookInfo("目送");
5.发送请求
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
}
@Override
public void onFailure(Call call, Throwable t) {
//如果设置了重试,但有些接口不需要重试
call.cancel();
}
});
Response response = call.excute();