本章節主要介紹xUtils3.x架構POST網絡請求同步和異步的兩種用法:
首先對RequestParams對象進行封裝,設定公共請求頭,cookie,逾時等,如下所示。
/**
* 封裝xutils的RequestParams
* Created by wangpf on 2017/8/19.
*/
public class NetParams extends RequestParams {
public NetParams(String url, int timeOut){
super(AppHelper.HTTPRUL+url);
setConnectTimeout(timeOut==0?30*1000:timeOut);
addHeader("Type","android");
long timestamp = System.currentTimeMillis()/1000;
addHeader("Timestamp", timestamp+"");
......
//設定cookie
if (!"f/app/user/login".equals(url)) { //登陸 和不需要cookie的接口
SharedPreferences sharedPreferences = x.app().getSharedPreferences(Constants.SHAREDNAME, Context.MODE_PRIVATE);
AppHelper.Cookie = sharedPreferences.getString("jsessionid", "");
addHeader("Cookie", "JSESSIONID="+AppHelper.Cookie);
setUseCookie(false);
}else{
setUseCookie(true);
}
}
}
(1)異步POST請求,很簡單直接上代碼
NetParams params = new NetParams("a/app/user/login", 0);
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onCancelled(CancelledException arg0) {
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
if(ex instanceof HttpException) { // 網絡錯誤
mHandler.obtainMessage(MSG_ERROR, "網絡異常,請檢查後重試").sendToTarget();
}else if (ex instanceof SocketTimeoutException){ // 其他錯誤
mHandler.obtainMessage(MSG_ERROR, "網絡請求逾時,請檢查後重試").sendToTarget();
}else {
mHandler.obtainMessage(MSG_ERROR, "使用者登入失敗,請檢查後重試").sendToTarget();
}
}
// 不管成功或者失敗最後都會回調該接口
@Override
public void onFinished() {
}
@Override
public void onSuccess(String msg) {
JSONObject jsonObject;
try {
jsonObject = new JSONObject(msg);
// TODO 業務處理
}catch(JSONException e) {
Log.e("evmsapp", e.getMessage());
mHandler.obtainMessage(MSG_ERROR, "使用者登入失敗,請檢查後重試").sendToTarget();
}
}
});
(2)同步POST請求,同步請求使用x.http().postSync(params, ResponseBean.class),直接傳回一個對象,其中請求參數與異步POST沒什麼差別,ResponseBean為同步請求傳回對象類型,ResponseBean可以自定義,用注解@HttpResponse(parser = JsonResponseParser.class)指定一個傳回結果解析器,本執行個體中解析器借助fastjson對傳回結果進行對象轉換。具體代碼如下:
JsonResponseParser解析器,實作接口ResponseParser。
import com.alibaba.fastjson.JSON;
import com.llg.utils.StringUtils;
import java.lang.reflect.Type;
import org.json.JSONObject;
import org.xutils.http.app.ResponseParser;
import org.xutils.http.request.UriRequest;
/**
* 使用ResponseParser自動解析定義的請求結果
* Created by wangpf on 2017/8/16.
*/
public class JsonResponseParser implements ResponseParser {
public Object parse(Type resultType, Class<?> resultClass, String result) throws Throwable {
try {
if(StringUtils.isEmpty(result)) {
return null;
}
new JSONObject(result);
}catch (Exception e) {
e.printStackTrace();
return null;
}
return JSON.parseObject(result, resultClass);
}
public void checkResponse(UriRequest request) throws Throwable {
}
}
同步請求傳回對象定義
import org.xutils.http.annotation.HttpResponse;
import java.util.List;
/**
* 接收同步網絡請求結果
* Created by wangpf on 2017/8/16.
*/
@HttpResponse(parser = JsonResponseParser.class)
public class ResponseMaintainBean extends ResponseBean {
private List<VehicleMaintainEntity> data;
public List<VehicleMaintainEntity> getData() {
return data;
}
public void setData(List<VehicleMaintainEntity> data) {
this.data = data;
}
}
同步請求具體使用x.http().postSync(params, ResponseMaintainBean.class)。
try {
NetParams params = new NetParams("a/app/maintain/list", 0);
params.addBodyParameter("carFrame", carFrame);
int pageNo = (int)(start/limit)+1;
params.addBodyParameter("pageNo", pageNo+"");
params.addBodyParameter("pageSize", limit+"");
//這裡就是使用同步請求的地方了,隻有一句代碼,可以直接傳回一個對象。
ResponseMaintainBean responseBean = x.http().postSync(params, ResponseMaintainBean.class);
if(responseBean != null) {
//TODO 業務處理
}else {
msgHandler.obtainMessage(EXCEPTION, "擷取xxxx資訊失敗,請檢查後重試").sendToTarget();
}
}catch (Throwable throwable) {
throwable.printStackTrace();
if(throwable instanceof HttpException) { // 網絡錯誤
msgHandler.obtainMessage(EXCEPTION, "網絡異常,請檢查後重試").sendToTarget();
}else if (throwable instanceof SocketTimeoutException){ // 其他錯誤
msgHandler.obtainMessage(EXCEPTION, "網絡請求逾時,請檢查後重試").sendToTarget();
}else {
msgHandler.obtainMessage(EXCEPTION, "擷取xxxx資訊失敗,請檢查後重試").sendToTarget();
}
}