RxJava Retrofit2 網路請求,返回資料格式統一的資料報文處理方法
統一的報文格式
一般公司開發都是會設計請求報文,報文結構一般是統一的,例如下面這樣的格式
{
"code": "error",
"msg": "錯誤資訊",
"data": "返回資料資訊"
}
data 有可能是JsonArray 也有可能是JsonObject。demo如下:
JsonArray
{
"code": "ok",
"msg": "",
"data": [
"1923837918273.jpg",
"1039488945879.jpg",
"3981293879878.jpg",
"5927378100293.jpg"
]
}
JsonObject
{
"code": "ok",
"msg": "",
"data": {
"fileName":"1923837918273.jpg"
}
}
那麼使用Json序列化工具的時候,資料格式就會發生一定的變形。
DataResponse.java
/**
* <b>類名稱:</b> DataResponse <br/>
* <b>類描述:</b> 攜帶有資料的Http請求報文<br/>
* <b>建立人:</b> Lincoln <br/>
* <b>修改人:</b> Lincoln <br/>
* <b>修改時間:</b> 2016年03月15日 下午5:19<br/>
* <b>修改備註:</b> <br/>
*
* @version 1.0.0 <br/>
*/
public class DataResponse<T> {
private String code;
private String msg;
private T data;
public String getCode() {
return code;
}
public void setCode(String 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;
}
}
當data為JsonObject時Observable的泛型如下
Observable<DataResponse<User>>
當data為JsonArray時Observable的泛型如下
Observable<DataResponse<List<String>>>
這樣泛型很多層,獲取資料更是一個體力活。我們的報文既然是固定格式的,那麼可不可以在處理的時候自動化?
答案是可行的!
使用map操作符,轉換資料流
map操作符是可以轉換資料流的操作符,那麼我們是不是可以將DataResponse<User>
或DataResponse<List<String>>
格式的泛型結構自動脫去一層?
最簡單的方法就是我們繼承Func1類,過載裡面的call方法,自動化脫掉一層泛型。
程式碼如下
import rx.functions.Func1;
/**
* <b>類名稱:</b> ResponseFunc <br/>
* <b>類描述:</b> 用於處理DataResponse資料格式的資料<br/>
* <b>建立人:</b> Lincoln <br/>
* <b>修改人:</b> Lincoln <br/>
* <b>修改時間:</b> 2016年03月23日 下午4:04<br/>
* <b>修改備註:</b> <br/>
*
* @version 1.0.0 <br/>
*/
public class ResponseFunc<T> implements Func1<DataResponse<T>, T> {
private static final String RESP_OK = "ok";
//此處邏輯根據約定報文進行修改,實現邏輯即可
@Override
public T call(DataResponse<T> httpResult) {
if (!httpResult.getCode().equals(RESP_OK)) {
// 在此處丟擲異常,subscribe的onError方法中會收到異常。
// 丟擲的異常不能是會使系統崩潰的檢查異常,如OOM
throw new IllegalStateException(httpResult.getMsg());
}
return httpResult.getData();
}
}
使用方法:
@Override
public void getConvenientBanner(final ServerView serverView) {
ConvenientBannerModel model = new ConvenientBannerModelImpl();
model.convenientBanner()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
//在此處呼叫一下,subscribe再處理的時候就脫掉了DataResponse
.map(new ResponseFunc<List<String>>())
.subscribe(new Action1<List<String>>() {
@Override
public void call(List<String> images) {
serverView.convenientBanner(images);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
DebugLog.e("首頁廣告圖獲取失敗," + throwable.getLocalizedMessage());
}
});
}
至此,即可簡便的處理統一格式的資料報文。XML、Json 均可以使用!
相關推薦
RxJava Retrofit2 網路請求,返回資料格式統一的資料報文處理方法
統一的報文格式 一般公司開發都是會設計請求報文,報文結構一般是統一的,例如下面這樣的格式 { "code": "error", "msg": "錯誤資訊", "data": "返回資料資訊" } data 有可能是JsonArray 也有可能是Jso
使用 fetch 封裝網路請求,返回promise 物件
1.fetch 的概念和用法 fetch 提供了對 Request 和 Response (以及其他與網路請求有關的)物件的通用定義。使之今後可以被使用到更多地應用場景中:無論是service workers、Cache API、又或者是其他處理請求和響應的方式,甚至
找到屬於自己的RxJava+Retrofit2網路請求
現在網路上面鋪天蓋地都是RxJava+Retrofit2的部落格,還有好多大神不斷地造輪子。然後在前段時間,由於專案的空檔期,我就對自己現在負責的專案嘗試了一下這RxJava+Retrofit2的寫法,對於我來說,首先是大量地看各位大神的部落格,從中不斷吸取精華
spring RestTemplate http post 請求,返回值中文是亂碼的解決方法
使用 spring 的 RestTemplate http post, 通過body 提交 json 型別的資料,返回值中文是亂碼的解決方法。 下面是虛擬碼 import java.nio.charset.Charset; import java.util.HashMap; impo
python爬取ajax請求,返回的json資料格式化報錯json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
python爬取ajax請求,返回Json資料中帶有<html><head></head><body><prestyle="word-wrap: break-word; white-space: pre-wrap;"></pre>
配置ajax請求springmvc返回json格式資料
首先在controller的方法返回值(返回值型別為實體類)上增加@ResponseBody註解 然後兩種配置方式如下: 方式一:spring4.0以及之後版本推薦 pom.xml增加如下依賴包 &l
spring4.1.4,使用ResponseBody註解返回JSON格式的資料時406 Not Acceptable錯誤。
最近使用spring4.1.4的Mvc,使用ResponseBody註解返回JSON格式的資料時報錯:406 Not Acceptable,在網上查了很多資料,大多數人說是因為缺少jackson包,只要把jackson包加進去就行了,我的專案不缺jackson包,而且是1.
php判斷上傳文件是不是圖片,如果是,返回圖片格式
int 格式 unpack char .com intval 圖片格式 unp filename /判斷文件是不是圖片格式@param fileName 文件名@return array 如果code為1,是圖片;否則不是圖片@author lee complet@163.
從零開始學 Web 之 Ajax(五)同步異步請求,數據格式
遊記 document 空閑 name center 20px 實現 resp 也會 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web前端之
安卓專案實戰之強大的網路請求框架okGo使用詳解(一):實現get,post基本網路請求,下載上傳進度監聽以及對Callback自定義的深入理解
1.新增依賴 //必須使用 compile 'com.lzy.net:okgo:3.0.4' //以下三個選擇新增,okrx和okrx2不能同時使用,一般選擇新增最新的rx2支援即可 compile 'com.lzy.net:okrx:1.0.2' compile 'com.lzy
Retrofit+Rxjava+MVP網路請求框架
導言: 之前有套基於MVP的網路請求框架,是okhttp封裝的,後來由於retrofit,rxJava的流行,所以更改一部分來使用 釋義: retrofit:基於okhttp再次封裝的網路請求框架 rxjava:非同步工具庫,handler+thread->asyctask-&
Spring Boot rest api 返回 XML 格式的資料
Spring Boot 預設返回json 格式的資料,Rest Api 可以根據使用者請求頭的不同 ,返回不同的媒體型別的響應(JSON XML 等)在預設的情況下,Spring 會安裝應用所定義的內容協商策略解析正確的內容 (使用者可以根據指定 Accept 頭資訊來返回不同型別的資訊
Android_Retrofit+RxJava+MVP+網路請求多次判斷
//依賴 compile 'io.reactivex.rxjava2:rxjava:2.1.1' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.squareup.retrofit2:retr
Spring MVC返回Map格式JSON資料 瀏覽器報406 錯誤
最近嘗試著部署ssm專案,登入功能驗證使用者登入資訊返回驗證結果的時候,前臺是用ajax請求。 前臺請求ajax程式碼如下: 後臺controller 前臺請求和controller都沒錯,tomcat 也沒有報錯,匯入了jackson-core-asl-1.9.13+j
httpPost請求,application/json格式
import net.sf.json.JSONObject; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.S
Spring Boot rest api 返回 XML 格式的資料
Spring Boot 預設返回json 格式的資料,Rest Api 可以根據使用者請求頭的不同 ,返回不同的媒體型別的響應(JSON XML 等)在預設的情況下,Spring 會安裝應用所定義的內容協商策略解析正確的內容 (使用者可以根據指定 Accept
Swift基礎之Demo包含重新整理,載入,網路請求,MVC
Swift中有一個Alamofire第三方是進行網路請求的,它是AFNetworking的作者寫的Swift形式,今天先介紹一下,利用pod匯入AFNetworking,SVProgressHUD,MJRefresh等第三方實現重新整理資料、載入更多、網路請求,同時使用了MV
laravel 中 api介面 使用 FormRequest 驗證時,返回json格式的 validate錯誤資訊
laravel 中使用 FormRequest類來做資料驗證時,預設是把validator的錯誤資訊寫入session中返回到前端頁面的 $errors中, 前端頁面 顯示如下 @if(count($errors->all())>0) <div
爬蟲記(一) - 傳送網路請求,解析JSON與靜態HTML
1.傳送網路請求 import requests r = requests.Session() headers = {'user-agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:59.0) Gecko/20100101
RxJava2+Retrofit2網路請求框架封裝及使用
最近把RxJava2和Retrofit2學習了一下,並做了一個簡單的封裝,算是對學習的總結,以及以後的做專案時可以,可以拿來及用。 注意:本篇不說RxJava2 和 Retrofit2的基礎使用,只梳理一下封裝的步驟,所以適合對RxJava2 和 Retrofit2有一定的