Volley请求的简单封装,以及applicaation/json数据请求

这几个月接触了几个项目,对于网络这一块都需要进行会话的保持,这样做也有很多好处,比如说请求的时候我们可以不用携带用户相关的敏感数据而服务端就能够识别,这里涉及到session和cookie相关不做介绍.

1.第一个,继承request,自定义一个request

在这里我们需要关注的主要有两个方法.

第一个是parseNetworkResponse,显而易见的这里我们需要将网络返回的二进制数据解析封装成我们需要的java实体类,这个方法的调用时在子线程执行的,在这个解析数据可以避免界面卡顿.

第二个是deliverResponse,这里对结果数据进行一次分发,这个数ui线程执行的,我们可以在这里对网络返回的结果进行一次统一的过滤,比如所登录失效了,这是在每个接口都有可能返回的,在这里过滤可以减少工作量,如果不需要截断,调用listener的onResponse返回结果

@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
    T t = null;
    if (response.statusCode == 200) {
        try {
            String c = response.headers.get("set-Cookie");
            if (c != null)
                cookie = response.headers.get("set-Cookie");
            String json = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers, Constant.CHARSET));
            L.e("接口返回的json数据:", json + "");

            JSONObject root = new JSONObject(json);
            errorCode = root.getInt("errorCode");
            massage = root.getString("massage");
            if (errorCode == RESPONSE_CODE_SUCCEED && (entyty != null || type != null)) {
                String entityJson = root.getString("entity");
                t = JsonUtils.getGson().fromJson(entityJson, entyty != null ? entyty : type);
            }
        } catch (JSONException | UnsupportedEncodingException e) {
            e.printStackTrace();
            return Response.error(new ParseError());
        }
        return Response.success(t, HttpHeaderParser.parseCacheHeaders(response));
    } else {
        L.i("GsonRequest", "网络异常,errorCode:" + response.statusCode);
        return Response.error(new NetworkError(response));
    }
}

@Override
protected void deliverResponse(T response) {
    switch (errorCode) {
        case RESPONSE_CODE_LOGIN_SUCCEED://登录成功
            distribute.onResponse(response);
            new CarchHandle(context).sendToService();
            break;
        case RESPONSE_CODE_SUCCEED://成功
            distribute.onResponse(response);
            break;
        case RESPONSE_CODE_UNLOGIN:
            L.e(this, "未登录,重新获取JSESSIONID");
            LoginModel model = new LoginModel(context);
            model.login(UserUtils.getUserInfo(context), new CommonListener() {
                @Override
                public void successListener(UserBean user) {
                    start(context);
                }

                @Override
                public void errorListener(int errorCode, String errorMassage) {
                    Toast.makeText(context, "请重新登录登录", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(context, LoginActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);
                }
            });
            break;
2.application/json请求
vollley的post请求采用的是默认的 application/x-www-form-urlencoded方式,这个可以看父类的getBodyContentType方法,我们只需要重写这个方法返回我们需要的contentType,并重写getBody方法返回请求的实体类容即可,这一以application/json为例
@Override
public byte[] getBody() throws AuthFailureError {
    return json.getBytes();
}

@Override
public String getBodyContentType() {

    return "application/json;charset=" + getParamsEncoding();
}

代码地址: https://github.com/linqipeng/volleyCustomrequest

你可能感兴趣的:(Android,Android,Volley,applicationjson)