个人总结之Volley的cookie处理
2016-02-24 00:00
295 查看
Volley是很好用的网络请求框架,但是有时候我们需要用到会话的管理,而Volley是不支持cookie的,不过庆幸的是Volley的扩展性很强,所以我们可以重写一些方法来达到我们想要的效果,例如登陆的时候,想提交cookie给服务器,并从服务器读取cookie等
我们在请求网络的时候,他会返回一个response,在这个response中有一个headers就包含了cookie的字段,切记的是,我们如果要存cookie的话,键值对的键必须是固定的"Cookie" ,否则识别不出来;调用headers返回的cookie如下:
![](http://static.oschina.net/uploads/space/2016/0224/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);
}
}
我们在请求网络的时候,他会返回一个response,在这个response中有一个headers就包含了cookie的字段,切记的是,我们如果要存cookie的话,键值对的键必须是固定的"Cookie" ,否则识别不出来;调用headers返回的cookie如下:
![](http://static.oschina.net/uploads/space/2016/0224/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);
}
}
相关文章推荐
- 排序算法-----冒泡排序和选择排序
- 排序算法----插入排序、归并排序
- Java注解类
- vi编辑器
- Navicat Premium 报表制作讲解
- 怎样实现MindMapper中文件夹导图的创建
- ubuntu下命令行发送邮件
- Android Studio中配置SonarQube
- freemarker 数字格式化
- 运行Spark例子程序
- 厦门巨游网络科技有限公司(HOTPOWER)承接游戏UI外包
- Java生成word/pdf解决方案
- js 使用
- JQuery获取指定范围的任意个随机数
- crosstool-ng
- GoldenGate架构下oracle与oracle数据同步
- 一健安装Zabbix
- 信息提醒之Toast-更新中
- 年度总结——
- Android实现SwipeBack(右滑退出)效果