一阻星、為什么要封裝?
1.方便自己使用
2.將Activity里網絡請求的業(yè)務代碼和UI展示的代碼分離已添,有點類似于MVP妥箕。
3.接口請求復用。
二更舞、如何封裝畦幢?
1.分析需求,根據公司接口做相應的處理缆蝉。
2.現(xiàn)在大多都是使用Json請求和響應宇葱,我只提供Json封裝的思路。
三刊头、開始封裝黍瞧,首先關聯(lián)相應的類庫
compile 'com.google.code.gson:gson:2.8.2' // 采用Gson解析
compile 'com.squareup.retrofit2:retrofit:2.3.0' // retrofit的關鍵庫
compile 'com.squareup.retrofit2:adapter-rxjava2:+'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1' // 引入Rxjava和RxAndroid
四、請求和響應數據的分析原杂。
1.請求后臺接口的數據格式
{
// 1. 具體的數據
"data": {
"loginName": "135****5219",
"loginPass": "12***56"
},
// 2. 公司接口的公共請求頭
"head": {
"_channel_": 1,
"_platform_id_": 1,
"_request_time_stamp_": 1516780484149
}
}
2.后臺響應的數據格式
{
"data": {
},
// 固定響應
"head": {
"bcode": "1",
"bmessage": "Success!",
"code": "1",
"message": "Success!",
"responseTime": "1516780484695"
}
}
從請求和響應的數據分析印颤,都有公共固定的請求參數,但data是不確定的穿肄,而且有可能是數組年局、字符串等等际看。
因為data是不固定的所以采用泛型設計最好。
五矢否、請求JavaBean的封裝
/**
* ================================================================
* 描述:請求頭
* ================================================================
*/
public class RequestHead {
public long _request_time_stamp_;
public int _channel_ = 1;
public int _platform_id_ = 1;
}
/**
* 請求數據的封裝
*/
public class RequestBean<T> {
/**
* 請求頭默認帶的
*/
public RequestHead head;
/**
* 請求的數據仿村,不固定
*/
public T data;
public RequestBean() {
this(null);
}
public RequestBean(T data) {
this.data = data;
this.head = new RequestHead();
}
}
六、響應數據的封裝兴喂,和請求思路一樣
/**
* 響應頭蔼囊,默認返回
*/
public class ResponseHead {
public String bcode;
public String bmessage;
public String code;
public String message;
public String responseTime;
}
/**
* 響應的封裝
*/
public class ResponseBean<T> {
/**
* 響應頭,默認返回
*/
public ResponseHead head;
/**
* 返回的數據衣迷,不固定
*/
public T data;
}
這樣畏鼓,數據的請求和響應的封裝就搞定。
七壶谒、泛型解析(自己用)
/**
* 服務端統(tǒng)一返回數據格式
* @param <T> 具體的數據
*/
public class ResponseData<T> {
private T data;
private String errorCode;// 0是成功
private String errorMsg;
public boolean isSucceed() {
return "0".equals(errorCode);
}
public int getErrorCode() {
try {
return Integer.parseInt(errorCode);
} catch (Exception e) {
}
return -1;
}
}
// 統(tǒng)一處理云矫,自己的網絡庫
abstract class AppCallback<T> : ICallback {
override fun onSuccess(result: String, client: RestClient) {
try {
// 1. 拿到泛型類型
val genericType = this.getType()
// 泛型T如果是字符串特殊處理
val isStr = genericType.toString() == "${String::class.java}"
if (isStr) {
onSucceed(result as T, client)
return
}
// 2. 創(chuàng)建ResponseData類型
val responseType = ParameterTypeImpl(ResponseData::class.java, genericType)
// 3. 拿到數據,轉成:ResponseData<T>
val data: ResponseData<T> = RestCreator.gson.fromJson(result, responseType)
// 4. 根據后臺約定判斷
if (data.isSucceed) {
onSucceed(data.data, client)
} else {
onError(data.errorCode, data.errorMsg, client)
}
} catch (e: Throwable) {
onError(-1, "解析數據異常", client)
}
}
abstract fun onSucceed(data: T, client: RestClient)
}