深入RxEasyHttp網路庫教你3分鐘學會自定義資料結構
github原始碼地址:https://github.com/zhou-you/RxEasyHttp
RxEasyHttp庫預設ApiResult簡介
在自定義ApiResult之前,先了解本庫中預設提供的ApiResult方式,包含code、msg、data三個欄位,其中預設code為0表示解析成功,內部是用ApiResult進行資料解析的。
預設ApiResult如下:
public class ApiResult<T> {
private int code;//伺服器返回的狀態碼
private String msg;//伺服器返回的成功/失敗資訊
private T data;//返回的真實資料,也是上層在頁面需要展示的資訊
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public boolean isOk() {
//請求成功的判斷方法,例如如果指定了code==0是成功,才會回撥onSuccess(T t),那麼code的非0其它數值都會走失敗onError(ApiException e)
return code == 0 ? true : false;
}
}
返回正確的json資料:
返回錯誤的json資料:
code:伺服器返回的狀態碼
msg:伺服器返回的成功/失敗資訊
data:返回的真實資料,也是上層在頁面需要展示的資訊
isOk():請求成功的判斷方法,例如指定了code==0是成功才會回撥onSuccess(T t),那麼code的其它數值都會走失敗onError(ApiException e)
為什麼需要自定義ApiResult
每個公司後臺都有自己的一套資料結構規範,資料規範基本都會包含code碼,錯誤資訊、返回的資料data。但是他們的欄位不一定是code、msg、data這樣的三個欄位。例如你的結構是error_code(code)、reason(msg)、result(data),那這樣就會導致解析失敗。而又不想因為幾個欄位的資料結構不一樣,所有的解析和業務邏輯重新寫一遍。而本庫就想讓你通過簡單的改造,快速的接入,滿足你的資料結構解析,所以提出了自定義資料結構的概念。
注:如果伺服器人員在寫介面時比較隨意完全沒有規範或者沒有code、msg這樣的結構,直接就是個bean,本庫就不支援後期可以考慮支援,暫時沒有提供針對非ApiResult結構的支援
自定義ApiResult原理
ApiResult類中包含code、msg、data的get和set方法,以覆蓋重寫的方式來解決,在自定義之前需要先用自己的資料結構對比庫中預設的資料結構,一樣的不用重複新增或者覆寫。最主要的是覆寫getCode()、getMsg()、getData()、isOk()四個方法,但不是這四個方法都必須全部覆寫看看不一致的地方,哪些不一致就覆寫哪些,set相關方法不用覆寫。主要解決思想就是把不一致的資料結構,改造成和庫中預設的結構一致或者靠攏。
注意:自定義ApiResult類時
TestApiResult<T> extends ApiResult<T>
其中<T>
必須寫
舉列1:伺服器返回的結構是和預設的標準結構一模一樣,只是code碼為1表示成功,而庫中0表示成功。那麼只需要覆寫isOk()
public class TestApiResult<T> extends ApiResult<T> {
@Override
public boolean isOk() {
return getCode()==1;//code等於1表示成功,所有覆寫isOk()
}
}
舉列2:伺服器返回的結構是error_code、reason、result和預設的標準結構完全不一樣
public class TestApiResult<T> extends ApiResult<T> {
int error_code; //對應預設標準ApiResult的code
String reason;//對應預設標準ApiResult的msg
T result;//對應預設標準ApiResult的data
@Override
public T getData() {//因為庫裡使用data欄位,而你的結構是result,所以覆寫getData()方法,setData()方法不用覆寫
return result;
}
@Override
public String getMsg() {//因為庫裡使用msg欄位,而你的結構是reason,所以覆寫getMsg()方法,setMsg()方法不用覆寫
return reason;
}
@Override
public int getCode() {//因為庫裡使用code欄位,而你的結構是error_code,所以覆寫getCode()方法,setCode()方法不用覆寫
return error_code;
}
@Override
public boolean isOk() {//因為庫裡使用code欄位,code==0表示成功,但是你的資料結構是error_code==0,所以覆寫isOk(),用error_code==0做為判斷成功的條件
return error_code == 0;//表示成功
}
}
舉列3:伺服器返回的結構是no,msg,obj結構,其中msg是一樣的就不用再特殊處理,no、obj不一樣需要處理
注:其它更多情景自己舉一反三
自定義ApiResult請求網路步驟
第一步:分析資料結構
如果返回的字串不好檢視結構,可以使用工具分析,例如json格式化工具sojson、bejson、Chrome瀏覽器外掛JSON-Handle、Json Viewer等
連結返回的json資料:
第二步:自定義資料結構
看到上面返回的json格式,結合自定義ApiResult原理,定義結構如下:
public class TestApiResult<T> extends ApiResult<T> {
int error_code; //對應預設標準ApiResult的code
String reason;//對應預設標準ApiResult的msg
T result;//對應預設標準ApiResult的data
@Override
public T getData() {
return result;
}
@Override
public String getMsg() {
return reason;
}
@Override
public int getCode() {
return error_code;
}
@Override
public boolean isOk() {
return error_code == 0;//表示成功
}
}
注:定義出的TestApiResult<T>
屬於公共的,同樣的資料結構都可以使用到
第三步:準備資料解析的result
自定義資料結構TestApiResult是個通用的結構,實體的data是result,result是泛型T,具體表示什麼,需要你自己檢視返回json結構,本例中result欄位中包含一個data欄位,data欄位是集合,所以如下:
public class Data {
private String content;
private String hashId;
private int unixtime;
private String updatetime;
public String getContent() {
return content;
}
public Data setContent(String content) {
this.content = content;
return this;
}
public String getHashId() {
return hashId;
}
public Data setHashId(String hashId) {
this.hashId = hashId;
return this;
}
public int getUnixtime() {
return unixtime;
}
public Data setUnixtime(int unixtime) {
this.unixtime = unixtime;
return this;
}
public String getUpdatetime() {
return updatetime;
}
public Data setUpdatetime(String updatetime) {
this.updatetime = updatetime;
return this;
}
@Override
public String toString() {
return "Data{" +
"content='" + content + '\'' +
", hashId='" + hashId + '\'' +
", unixtime=" + unixtime +
", updatetime='" + updatetime + '\'' +
'}';
}
}
public class Result {
private List<Data> data;
public void setData(List<Data> data) {
this.data = data;
}
public List<Data> getData() {
return data;
}
@Override
public String toString() {
return "Result{" +
"data=" + data +
'}';
}
}
第四步:網路請求資料
自定義的網路請求必須用回撥代理execute(CallBackProxy<? extends ApiResult<T>, T> proxy)
來請求網路
EasyHttp.get("http://japi.juhe.cn/joke/content/list.from")
.params("key", "f5236a9fb8fc75fac0a4d9b8c27a4e90")
.params("page", "1")
.params("pagesize", "10")
.params("sort", "asc")
.params("time", "1418745237")
.execute(new CallBackProxy<TestApiResult<Result>, Result>(new ProgressDialogCallBack<Result>(mProgressDialog) {
@Override
public void onError(ApiException e) {
super.onError(e);
showToast(e.getMessage());
}
@Override
public void onSuccess(Result result) {
if (result != null) showToast(result.toString());
}
}) {
});
注:通過以上四個步驟就完成了自定義資料結構網路請求資料,是不是覺得寫法會有點長,CallBackProxy的泛型引數每次都需要填寫,其中TestApiResult是繼承ApiResult的,對於一個實際專案來講後臺的伺服器資料結構是固定的,也就是TestApiResult是固定的,這種方法太麻煩了,那有沒有簡單的寫法,而又不破壞庫的使用方式,請看自定義ApiResult高階用法。
自定義ApiResult高階用法
上面已經提到過使用自定義網路請求必須要用new CallBackProxy<TestApiResult<Result>, Result>
,會有很多重複的操作,結合上面我們看下如何簡寫。講解之前先說下庫中實現方式,網路請求EasyHttp.get()是返回一個GetRequest請求,EasyHttp.post()是返回一個PostRequest請求.如果想讓所有的請求execute()方法都自動加上new CallBackProxy<TestApiResult<T>, T>
,就需要修改execute()方法,而execute()方法是在GetRequest和PostRequest中,所以我們需要分別繼承GetRequest和PostRequest,重寫execute()方法。具體操作如下:
自定義GetRequest請求
注:下面程式碼可以直接拷貝過去使用,其中的TestApiResult修改成自己的ApiResult就可以了
public class CustomGetRequest extends GetRequest {
public CustomGetRequest(String url) {
super(url);
}
@Override
public <T> Observable<T> execute(Type type) {
return super.execute(new CallClazzProxy<TestApiResult<T>, T>(type) {
});
}
@Override
public <T> Observable<T> execute(Class<T> clazz) {
return super.execute(new CallClazzProxy<TestApiResult<T>, T>(clazz) {
});
}
@Override
public <T> Subscription execute(CallBack<T> callBack) {
return super.execute(new CallBackProxy<TestApiResult<T>, T>(callBack) {
});
}
}
自定義PostRequest請求
注:下面程式碼可以直接拷貝過去使用,其中的TestApiResult修改成自己的ApiResult就可以了
public class CustomPostRequest extends PostRequest {
public CustomPostRequest(String url) {
super(url);
}
@Override
public <T> Observable<T> execute(Type type) {
return super.execute(new CallClazzProxy<TestApiResult<T>, T>(type) {
});
}
@Override
public <T> Observable<T> execute(Class<T> clazz) {
return super.execute(new CallClazzProxy<TestApiResult<T>, T>(clazz) {
});
}
@Override
public <T> Subscription execute(CallBack<T> callBack) {
return super.execute(new CallBackProxy<TestApiResult<T>, T>(callBack) {
});
}
}
新建請求的管理類方便使用
public class HttpManager {
/**
* get請求
*/
public static GetRequest get(String url) {
return new CustomGetRequest(url);
}
/**
* post請求
*/
public static PostRequest post(String url) {
return new CustomPostRequest(url);
}
}
新的網路請求方式
HttpManager.get("http://japi.juhe.cn/joke/content/list.from")
.params("key", "f5236a9fb8fc75fac0a4d9b8c27a4e90")
.params("page", "1")
.params("pagesize", "10")
.params("sort", "asc")
.params("time", "1418745237")
.execute(new ProgressDialogCallBack<Result>(mProgressDialog) {//這麼實現是不是沒有代理了
@Override
public void onError(ApiException e) {
super.onError(e);
showToast(e.getMessage());
}
@Override
public void onSuccess(Result result) {
if (result != null) showToast(result.toString());
}
});
使用方式對比
具體原始碼請檢視GitHub中提供的Demo:https://github.com/zhou-you/RxEasyHttp
相關文章
- 自定義響應資料結構資料結構
- Oracle資料庫開發——深入索引結構Oracle資料庫索引
- 一分鐘教你學會搭建ngrok內網穿透內網穿透
- SQL Server Page資料庫結構深入分析SQLServer資料庫
- 根據資料庫中取記錄自定義一棵樹結構 (轉)資料庫
- 自定義註解完成資料庫切庫資料庫
- GridView自定義列資料繫結,和自定義頒功能View
- Redis深入之資料結構Redis資料結構
- PostgreSQL 資料庫學習 - 1.資料庫體系結構之儲存結構SQL資料庫
- 網際網路資料庫架構設計資料庫架構
- keras自定義網路層Keras
- 收藏資料結構學習網站資料結構學習網站
- 5分鐘教你使用idea除錯SeaTunnel自定義外掛Idea除錯
- 教你快速掌握Oracle資料庫結構的16個要點Oracle資料庫
- 教你如何自定義AlertViewView
- 5分鐘瞭解資料結構資料結構
- 深入瞭解Redis資料結構Redis資料結構
- 奈學教你五分鐘學會分散式事務分散式
- ASP.NET Core Identity自定義資料庫結構和完全使用Dapper而非EntityFramework CoreASP.NETIDE資料庫APPFramework
- mysql資料庫-資料結構MySql資料庫資料結構
- 【01】把 Elasticsearch 當資料庫使:表結構定義Elasticsearch資料庫
- 自定義開發資料庫升級程式資料庫
- 瀚高資料庫自定義操作符'!~~'資料庫
- 在資料庫中自定義外部函式資料庫函式
- 資料結構學習(C++)——圖【5】活動網路(AOV、AOE) (轉)資料結構C++
- Oracle 資料庫 結構Oracle資料庫
- 個人網站建設之資料庫結構網站資料庫
- 資料結構:順序結構和鏈式結構的資料型別定義資料結構資料型別
- flutter:教你自定義DialogFlutter
- 手把手教你快速構建自定義分類器
- 深入理解Redis 資料結構—雙連結串列Redis資料結構
- database資料庫的資料結構Database資料庫資料結構
- Hive學習之二 《Hive的安裝之自定義mysql資料庫》HiveMySql資料庫
- 學《資料結構》有感資料結構
- 資料結構學習資料結構
- 資料結構學習之樹結構資料結構
- 網路每分鐘產生多少資料–資料資訊圖
- MySQL資料庫之網際網路常用架構方案(全)MySql資料庫架構