我的总结之Volley的cookie处理

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

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


    因此咱们若是要用的话,须要用正则来匹配这个字符串cookie

    如下是贴出的代码:
网络

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字符串
ide

            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);函数

            //这里是本身的处理,你们能够根据本身的需求来进行相应的改动
this

            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) {url

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

若是咱们要是使用的话,能够以下,这是本身封装的一个方法,格式以下

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);
    }

}

相关文章
相关标签/搜索