简述
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
,
@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);