个人总结之Volley的cookie处理

    Volley是很好用的网络请求框架,但是有时候我们需要用到会话的管理,而Volley是不支持cookie的,不过庆幸的是Volley的扩展性很强,所以我们可以重写一些方法来达到我们想要的效果,例如登陆的时候,想提交cookie给服务器,并从服务器读取cookie等

    我们在请求网络的时候,他会返回一个response,在这个response中有一个headers就包含了cookie的字段,切记的是,我们如果要存cookie的话,键值对的键必须是固定的"Cookie" ,否则识别不出来;调用headers返回的cookie如下:   

164412_NXxl_2633885.png

    所以我们如果要用的话,需要用正则来匹配这个字符串

    以下是贴出的代码:

public class GsonRequest<T> extends Request<T> {
    private final Gson mGson;

    private final Class<T> mClass;

    private final Listener<T> mListener;

    private Map<String, String> mMap;
    private Map<String, String> sendHeader = new HashMap<String, String>(1);
    private String mHeader;
    private String cookieFromResponse = "";
    public GsonRequest(int method, String url, Class<T> objectClass, Listener<T> listener, ErrorListener errorListener) {

        super(method, url, errorListener);
        this.mClass = objectClass;
        this.mListener = listener;
        mGson = new Gson();
    }
    
    /**
     * 用于POST请求的构造函数
     *
     * @param url
     *            地址
     * @param map
     *            参数
     * @param objectClass
     *            输出类型
     * @param listener
     *            正确返回结果的监听
     * @param errorListener
     *            错误返回结果的监听
     */
    public GsonRequest(String url, Map<String, String> map, Class<T> objectClass, Listener<T> listener, ErrorListener errorListener) {
        super(Request.Method.POST, url, errorListener);
        this.mClass = objectClass;
        this.mListener = listener;
        this.mMap = map;
        mGson = new Gson();
    }

    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        return mMap;
    }

    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
          
            String json = new String(response.data, "UTF-8");

            //这里就是返回的Set-cookie的cookie字符串

            mHeader = response.headers.toString();
            Pattern pattern = Pattern.compile("Set-Cookie.*?;");
            Matcher m = pattern.matcher(mHeader);
            if (m.find()) {
                cookieFromResponse = m.group();
            }
            if (cookieFromResponse.length() > 12) {
                // 去掉cookie末尾的分号
                cookieFromResponse = cookieFromResponse.substring(11, cookieFromResponse.length() - 1);
            }
            JSONObject jsonObject = new JSONObject(json);

            //这里是自己的处理,大家可以根据自己的需求来进行相应的改动

            if(jsonObject.has("SmsBean")){
                jsonObject.getJSONObject("SmsBean").put("Cookie", cookieFromResponse);
            }
            if(jsonObject.has("ResultMsg"))
            {
                jsonObject.getJSONObject("ResultMsg").put("Cookie", cookieFromResponse);
            }
            
            return Response.success(mGson.fromJson(jsonObject.toString(), mClass), HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException e) {
            return Response.error(new ParseError(e));
        }
    }

    @Override
    protected void deliverResponse(T response) {
        mListener.onResponse(response);
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return sendHeader;
    }

    public void setSendCookie(String cookie) {

        sendHeader.put("Cookie", cookie);       //这里的键必须是Cookie
    }
}

如果我们要是使用的话,可以如下,这是自己封装的一个方法,格式如下

public class RequestUtil{

    public static void sendMsg(String cookie,String name, String number, Listener<SendSmsBean> listener, ErrorListener errorListener) {
        Map<String, Object> sendMesParams = new HashMap<String, Object>();
        sendMesParams.put("name", name);
        sendMesParams.put("number", number);
        String url = "www.xxxx.com";
        GsonRequest<SendSmsBean> request = new GsonRequest<XXXBean>(Method.GET, url, XXXBean.class, listener, errorListener);
        request.setSendCookie(cookie);
        RequestManager.getRequestQueue().add(request);
    }

}

转载于:https://my.oschina.net/fbf8866/blog/620366

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值