您的位置:首页 > 其它

个人总结之Volley的cookie处理

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

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

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: