1. 程式人生 > >RxJava Retrofit2 網路請求,返回資料格式統一的資料報文處理方法

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使用詳解(一):實現getpost基本網路請求下載上傳進度監聽以及對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有一定的