rxjava2+retrofit2

96 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情​​

 简述

Retrofit2square公司出品的一个网络请求库,网上有很多相关的介绍。

  • 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);