概念
官方定义:Retrofit是一套Restful架构的Android(Java)客户端实现,基于注解,提供JSON to POJO(Plain Ordinary Java Object,简单Java对象),POJO to JSON,网络请求(POST,GET,PUT,DELETE等)封装。
本质:就是一种网络请求框架。
特点介绍
对于网络请求Android优先使用Okhttp,2.3之后使用HttpUrlConnection,2.3之前使用HttpClient。
Retrofit 就是对Okthttp再做一层封装,是一套注解形式的网络请求封装库,让我们的代码结构更给为清晰。它可以直接解析JSON数据变成JAVA对象,默认是GsonConverter(也可以自定义,也可以直接使用Jackson解析等),并支持回调操作,处理多种结果。
Api注解介绍
Retrofit的所有请求都需要一个请求方法注解并相对url路径作为参数,内含有多个http的注解:如Get、Post、Put、Delete、Head等。
Get:Get请求;
@GET(“group/users”)
Call<Result> groupList(@Query(“id”) int groupId);
等同于
@GET(“group/users?id=groupId")
Post:用于Post方式传递参数,需要在请求接口方法上添加@FormUrlEncoded,即以表单的方式传递参数.示例:
//用户登录
@FormUrlEncoded
@POST("user/app_login")
Call<UserInfo> login(@Field("wechat-info") String wechatInfo);
Put:用于发送一个PUT请求;
Delete:DELETE注解一般必须添加相对路径或绝对路径或者全路径,如果不想在DELETE注解后添加请求路径,则可以在方法的第一个参数中用@Url注解添加请求路径。
Head:添加http header,分为Head和Heads
Head:
@GET(“group/users”)Call<List<User>> groupList(@Head(“id”) int groupId);
等同于
@Heads(“id:groupId”)//这里面的groupId为上面的方法传递过来的值@GET(“group/users”)
Call<List<UserInfo>> groupList(@Head(“id”) int groupId);
Heads跟@Header作用一样,只是使用方式不一样,@Header是作为请求方法的参数传入,@Headers是以固定方式直接添加到请求方法上.示例:添加多个设置
@Headers
({ "Accept: application/vnd.github.v3.full+json",
"id: Retrofit-Sample-App"})
Call<List<User>> groupList(@Head(“id”) int groupId);
Path:用于URL上占位符.
如:@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
将groupId变量的值替换到url上的id位置
扩展:
@Parh:
配合@Multipart使用,一般用于文件上传;
@Multipart
@POST(Api.UPLOAD_IMAGE_AND_VIDEO) //上传视频和封面 Call<ApiResponseObject<UploadFrameAndVideoBean>> upLoadFrameAndVideo(@Part("userId") RequestBody userId);
@Body:
当你发送一个post或put请求,但是又不想作为请求参数或表单的方式发送请求时,使用该注解定义的参数可以直接传入一个实体类,retrofit会通过convert把该实体序列化并将序列化后的结果直接作为请求体发送出去.
实例:
//实体
class UserEntity{
public String userId;
public String icon;
public String nickname;
@Override
public String toString() {
return "RecommendUserFormListBean{" +
"userId='" + userId + '\'' +
", icon='" + icon + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
//接口
interface Service{
@POST(“common/follow”)
Call<ResposeBody> addCommon(@Body UserEntity)
}
@Field : 同@Post一起用,作用于方法的参数,发送一个表单请求。
@FieldMap:map中每一项的键和值都不能为空,否则抛出IllegalArgumentException异常 ;
@FormUrlEncoded
@POST("user/app_login")
Call<ApiResponseObject<UserInfo>> login(@FieldMap Mapfields);
@FormUrlEncoded:使用该注解,表示请求正文将使用表单网址编码,用于修饰Field注解和FieldMap注解;
@Multipart : 使用该注解,表示请求体是多部分的。 每一部分作为一个参数,且用Part注解声明;
Retrofit初始化:
ApiService.java,如图1,2:
* baseUrl:这里才真正给出了请求的地址,这里的地址会和ApiCreator中的GET/post/put等注解中的参数/进行拼接;
* 默认使用OkhttpClient请求方式,但是Retrofit一旦在项目中发现Okhttp,会自动集成Okhttp并优先使用;
* 通过Cache来设置缓存大小及位置;
* addConverterFactory:GsonConverterFactory,本文使用Gson解析;
* RxJavaCallAdapterFactory:如果返回数据封装成Observer,则使用Rxjava技术处理数据,adapterFactory.create()使用动态代理生成我们定义的接口的实现了类,并通过其返回(Retrofit的所有json与object转化工作由RestAdapter)。
好啦,以上的retrofit介绍完了!
简单介绍如何使用:
* 首先在模块.gradle添加依赖,导入库:
* 新建需要返回的数据类型模型:CategoryListEntity.java
class CategoryListEntity{
public int code;
public String msg;
public int haveData;
public List<DataBean>data;
}
* 采用Get注解方式请求:
* 调用走起:
Call <CategoryListEntity>observable= ApiService.getInstance().createApi().getCategoryList(userId);
就可以啦,其实很简单。