简述
Retrofit2
是square
公司出品的一个网络请求库,网上有很多相关的介绍。
-
get
请求 -
post
请求 - 文件上传
- 文件下载
- 开启日志拦截
- 与RxJava结合使用
什么是Retrofit2
官网是这么介绍的:
Retrofit adapts a Java interface to HTTP calls by using annotations on the declared methods to
define how requests are made。
他的大概意思是说:Retrofit 是一个 java 接口类,以注解的方式用于 HTTP 网络请求。
使用前的配置
build.gradle 的 dependencies 添加:
获取Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://plus31.366ec.net/")
.addConverterFactory(GsonConverterFactory.create())
.build();
需要注意的是baseUrl
添加的是地址的主域名。
申明RestService接口类
public interface RestService {
@GET("/Route.axd?method=vast.Store.manager.list")
Call<ResponseBody> getManagerData(@Query("StoreId") int id);
}
@GET
包含的是请求地址,是主域名之后的地址。举个例子,请求的
全地址:http://plus31.366ec.net/Route.axd?method=vast.Store.manager.list
,
主域名为:http://plus31.366ec.net/
@GET包含的地址为:/Route.axd?method=vast.Store.manager.list
这样就完成了一个简单的@GET
封装。
创建RestClient类
public class RestClient {
private Retrofit mRetrofit;
private static final String BASE_URL = "http://plus31.366ec.net/";
private RestService mService;
//构造方法
public RestClient() {
mRetrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
mService = mRetrofit.create(RestService.class);
}
public RestService getRectService() {
if (mService != null) {
return mService;
}
return null;
}
}
这样就生成了一个简单的代理类,然后就可以进行相应请求了。
Get请求
分析返回的 json
数据,包含集合,那么我们可以进一步对接口返回值进行数据的封装。
BaseResponse类
public class BaseResponse<T> {
@SerializedName("data")
public List<T> managerList;
@SerializedName("code")
public int code;
@SerializedName("message")
public String message;
}
注意:BaseResponse
类的字段,根据自己返回json
数据新增或者删除。
根据返回的json
集合,那么我们肯定有个实体类了。
Manager类
public class Manager {
public int Id;
public String UserName;
}
Manager
类你可以替换成你自己的实体类。
Get的进一步封装
@GET("/Route.axd?method=vast.Store.manager.list")
Call<BaseResponse<Manager>> getManagerDatas(@Query("StoreId") int id);
注意:我们这里对方法的返回值进行了一个修改Call<BaseResponse<Manager>>
来看看封装后的Activity
类:
Get常用技巧
HashMap组装参数
:
@GET("/Route.axd?method=vast.Store.manager.list")
Call<BaseResponse<Manager>> getManagerDatas(@QueryMap HashMap<String, String> hm);
Get
请求就讲到这里了,下面一起来看看 Post
请求。
Post请求
@FormUrlEncoded
@POST("/Route.axd?method=vast.Store.manager.list")
Call<BaseResponse<Manager>> postManagerDatas(@Field("StoreId") int id);
@Field("StoreId") int id
可以替换@Body
,@Body
你可以传入HashMap
、实体 beans
等对象。
注意:以@Body
上传参数,会默认加上Content-Type: application/json;
charset=UTF-8
的请求头,即以JSON
格式请求,再以JSON
格式响应。
单个文件上传
@Multipart
@POST("/UploadProduct.axd")
Call<ResponseBody> uploadSimpleFile(@Part MultipartBody.Part file);