Retrofit :A type-safe HTTP client for Android and Java.
retrofit : noun. a component or accessory added to something after it has been manufactured
mocky.io: Mock your HTTP responses to test your REST API
前言
本文默認ConverterFactory
爲GsonConverterFactory
。
請求階段
- Header的統一處理
- 訪問絕對路徑
- Map的使用避免聲明冗餘的類
- RequestBody爲String 及 文件上傳
返回階段
- 後臺Json空數據規範
- 空數據Void聲明
- ResponseBody爲String
- ResponseBody的多次讀取
- 統一的錯誤處理
Header的統一處理
使用Interceptor
可爲每一個request
添加統一的Header
信息
|
|
訪問絕對路徑
- @Url
@URL resolved against the base URL.
這種方式是動態的靈活的,不需要提前預知的。
|
|
- endpoint爲絕對路徑
這種方式需要在編碼時提前預知,與baseUrl
的理念是相沖突的,不推薦使用這種方式。
Map的使用避免聲明冗餘的類
QueryMap爲Query支持複雜的、不定數的字段。
對應的Body也可以通過定義參數類型爲Map來避免聲明冗餘的類。
以下代碼爲了Post
/Put
的Body
特別定義了個IsReead
類,實現方式有些重!
|
|
與如下代碼的功能是相同,但更簡單明瞭的:
|
|
同樣的,在請求的返回階段,如果返回內容都是單純的key: value,那ResponseBody也可以定義爲Map。
不必每個接口都有對應的數據類。
RequestBody爲String 及 文件上傳
App中嵌套的H5頁面傳給App的內容是Json格式化的字符串,並要作爲Body發起Post/Put請求,這時則希望RequestBody爲String,則處理爲:
|
|
如果將MediaType改爲圖片、視頻等對應的MediaType值,則很可很方便的實現文件上傳接口:
|
|
後臺Json空數據規範
客戶端請求數據時,後臺對空數據的返回應該是要有規範的,
應該按Json格式返回 [] 空數組或 {} 空對象,不應什麼都不返回.
什麼都不返回會導致Json解析異常,會誤導客戶端判定連接爲CMCC/ChinaNet等假網絡,導致提示網絡異常,與實際情況不符。
喂喂,後臺同學,都是開發狗,能不能別互相傷害
空數據Void聲明
如果只需要發個請求然後根據response code爲HTTP_OK(200)即可,而不需要後臺回吐額外的數據,在定義接口時可以聲明ResponseBody爲Void。
|
|
ResponseBody爲String
當要將後臺回吐的數據通過App傳參給內嵌的H5頁面時,這時希望ResponseBody爲String,應該這麼做:
|
|
ResponseBody的多次讀取
當試圖去讀取response body的原始數據時,由於是從網絡上以stream的方式讀取的,所以多次讀取的話會拋如下異常:
|
|
|
|
實現了多次讀取的功能後,就可以進行下面的統一錯誤處理了。
統一的錯誤處理
發起一次請求後可能產生的錯誤有:
網絡問題:
- 無網絡訪問失敗
- 鏈接超時等IO異常
- 假網絡鏈接
後臺提示錯誤:
- 請求參數不規範
- 業務邏輯錯誤,如提交的內容包含敏感詞
- Json解析失敗
response code
不是HTTP_OK
以上錯誤會分散在Callback
的onResponse()
及onFailure()
中去。
不利於技術層的數據統計及業務層的錯誤兼容。
那麼在做統一的錯誤處理時,目標有:
onResponse()
是純粹的success
回調,剝離了response code
或解析失敗等異常。- 能夠讀取後臺返回的數據源進行處理後,不影響數據源的繼續傳播與解析。即上文提到的多次讀取。
能夠統一進行錯誤處理的方式有Interceptor
及對Callback
進行override
。
個人選擇Callback override
的方式,個人觀點希望每個類是儘可能可複用的,對於每一次request
,都有對應的Callback
,那麼就不想再定義新的類(Interceptor
)來處理。
而且每一個request
都有新的callback
的實例對象,也好進行一些個性化的錯誤處理。
新的Callback
代碼如下:
|
|