Retrofit+OkHttp+RxJava
Retrofit 負(fù)責(zé) 請求的數(shù)據(jù)和請求的結(jié)果锋勺,使用接口的方式呈現(xiàn)乍丈,OkHttp負(fù)責(zé)請求的過程衙解,RxJava 負(fù)責(zé)異步豁辉,各種線程之間的切換令野。
在定義接口的時(shí)候可以直接返回你想要的數(shù)據(jù)格式Bean
Retrofit會(huì)在返回結(jié)果的時(shí)候直接將這個(gè)格式Bean返還給你
一般情況下后臺(tái)開發(fā),在同一個(gè)接口返回?cái)?shù)據(jù)的格式的話是統(tǒng)一的:
打個(gè)比方:
登錄成功接口返回?cái)?shù)據(jù)
{
? ? "status": 0,
? ? "msg": "登錄成功徽级!",
? ? "data": "12345678"
}
登錄失敗接口返回?cái)?shù)據(jù)
{
? ? "status": 999,
? ? "msg": "登錄失斊啤!",
? ? "data": ""
}
如果是這樣是不會(huì)出現(xiàn)錯(cuò)誤的餐抢。
但是我們后臺(tái)在失敗時(shí)候返回的數(shù)據(jù)格式變了现使。例如:
{
? ? "status": 999,
? ? "msg": "登錄失數统住!",
? ? "data": []
}
data本來是一個(gè)String類型突然變成了一個(gè)數(shù)組類型,這時(shí)候就會(huì)出現(xiàn)錯(cuò)誤
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_STRING but was BEGIN_ARRAY at line 1 column 98 path $.data
這時(shí)候我該怎么辦碳锈,我肯定不能挨個(gè)接口去判斷顽冶,所以我準(zhǔn)備從基礎(chǔ)下手。
首先我確定了我們的接口status和msg這兩個(gè)肯定是不會(huì)改變的售碳,這兩個(gè)參數(shù)對(duì)于所有接口都是通用的參數(shù)渗稍。
建立Bean
其次解析數(shù)據(jù)格式的為retrofit的
方法。
通過這句代碼去設(shè)置一個(gè)解析工廠团滥。
so我需要做的就是去重寫GsonConverterFactory 在解析返回?cái)?shù)據(jù)的時(shí)候去加個(gè)判斷
首先定義CustomGsonConverterFactory去繼承 Converter.Factory
其次新建CustomGsonResponseBodyConverter實(shí)現(xiàn)implements Converter?
responseBodyConverter這個(gè)方法是處理ResponseBody的
在convert里面可以拿到ResponseBody
之后ResponseBody解析為公共的AllBean
AllBean判斷status是否等于0
如果是的話正常解析就好了
如果不是0的話再將AllBean轉(zhuǎn)成String賦值給response之后去解析
因?yàn)锳llBean里面的參數(shù)是公共的,所以就不會(huì)出現(xiàn)解析的異常了
至此問題解決报强。
自定義可以根據(jù)需求在里面寫的更詳細(xì)灸姊,我只是記錄一下,如果再遇到此類問題秉溉,我應(yīng)該想到的解決方案應(yīng)該是什么樣子力惯,在哪里下手。