天天看點

xUtils3.3.x POST請求使用執行個體

本章節主要介紹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();
			}
		}