Android Volley框架定制JsonRequest添加Cookie
来源:互联网 发布:java模糊查询 编辑:程序博客网 时间:2024/06/06 11:02
发现问题
Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。
Volley本身是不支持cookie,但是既想使用volley又想在对服务器发起http请求时加上cookie,并从服务器给的响应中读取cookie。怎么办呢?
其实很简单,Volley提供了非常强的扩展机制,使得我们可以很轻松地定制出任意类型的Request。
定制JsonObjectGetRequest
该定制Request可用于Get一条JSON格式的数据,同时能向服务器发起http请求时加上cookie。
import java.io.UnsupportedEncodingException;import java.util.HashMap;import java.util.Map;import org.apache.http.protocol.HTTP;import org.json.JSONException;import org.json.JSONObject;import android.util.Log;import com.android.volley.AuthFailureError;import com.android.volley.NetworkResponse;import com.android.volley.ParseError;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.toolbox.HttpHeaderParser;/* * Volley Get类型 可以发送Cookie * */public class JsonObjectGetRequest extends Request<JSONObject> { private Response.Listener<JSONObject> mListener; // 保存cookie public String cookieFromResponse; private Map<String, String> sendHeader = new HashMap<String, String>(); public JsonObjectGetRequest(String url, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) { super(Request.Method.GET, url, errorListener); mListener = listener; } @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { // 防止中文乱码 @SuppressWarnings("deprecation") String jsonString = new String(response.data, HTTP.UTF_8); // 将cookie字符串添加到jsonObject中,该jsonObject会被deliverResponse递交,调用请求时则能在onResponse中得到 JSONObject jsonObject = new JSONObject(jsonString); Log.w("json", "jsonObject " + jsonObject.toString()); return Response.success(jsonObject, HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } @Override protected void deliverResponse(JSONObject response) { mListener.onResponse(response); } @Override public Map<String, String> getHeaders() throws AuthFailureError { return sendHeader; } public void setSendCookie(String cookie) { sendHeader.put("Cookie", cookie); }}
使用方法
JsonObjectGetRequest get = new JsonObjectGetRequest(Url.api, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { try { //TODO 响应操作 } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //TODO 响应操作 Log.e("HTTP_get", error.getMessage(), error); }});// 向服务器发起post请求时加上cookie字段get.setSendCookie(customer.getCookie());mQueue.add(get);
定制JsonObjectPostRequest
该定制Request可用于Post一条JSON格式的数据,同时能向服务器发起http请求时加上cookie,并从服务器给的响应中读取cookie。
import java.io.UnsupportedEncodingException;import java.util.HashMap;import java.util.Map;import org.apache.http.protocol.HTTP;import org.json.JSONException;import org.json.JSONObject;import com.android.volley.AuthFailureError;import com.android.volley.NetworkResponse;import com.android.volley.ParseError;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.toolbox.HttpHeaderParser;import android.util.Log;/** * Volley Post类型 可以接受和发送Cookie */public class JsonObjectPostRequest extends Request<JSONObject> { private Map<String, String> mMap; private Response.Listener<JSONObject> mListener; // 保存cookie public String cookieFromResponse; private Map<String, String> sendHeader = new HashMap<String, String>(); public JsonObjectPostRequest(String url, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener, Map<String, String> map) { super(Request.Method.POST, url, errorListener); mListener = listener; mMap = map; } // 当http请求是post时,则需要该使用该函数设置往里面添加的键值对 @Override protected Map<String, String> getParams() throws AuthFailureError { return mMap; } // 重写方法,处理cookie @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { // 防止中文乱码 @SuppressWarnings("deprecation") String jsonString = new String(response.data, HTTP.UTF_8); // 将cookie字符串添加到jsonObject中,该jsonObject会被deliverResponse递交,调用请求时则能在onResponse中得到 JSONObject jsonObject = new JSONObject(jsonString); // 获取cookie字段 sendHeader = response.headers; // 如果因为一些原因没有返回cookie的判断 if (sendHeader.get("Set-Cookie") != null) { cookieFromResponse = sendHeader.get("Set-Cookie"); cookieFromResponse = cookieFromResponse.replace("\n", ";"); Log.w("cookie", cookieFromResponse); jsonObject.put("Cookie", cookieFromResponse); } Log.w("json", "jsonObject " + jsonObject.toString()); return Response.success(jsonObject, HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } @Override protected void deliverResponse(JSONObject response) { mListener.onResponse(response); } @Override public Map<String, String> getHeaders() throws AuthFailureError { return sendHeader; } public void setSendCookie(String cookie) { sendHeader.put("Cookie", cookie); }}
使用方法
//json格式的数据HashMap<String, String> urlParams = new HashMap<String, String>();urlParams.put("phone", user.getText().toString());urlParams.put("password", psw.getText().toString());JsonObjectPostRequest post = new JsonObjectPostRequest(Url.api, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { try { //TODO 响应操作 //保存Cookie customer.setCookie(jsonObject.getString("Cookie")); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //TODO 响应操作 Log.e("HTTP_login", error.getMessage(), error); } }, urlParams);//判断是否有Cookieif (!user.getCookie().equals("")) { // 向服务器发起post请求时加上cookie字段 post.setSendCookie(user.getCookie());}mQueue.add(post);
作者:黄伟杰
原文链接:Android Volley框架定制JsonRequest添加Cookie
阅读全文
0 0
- Android Volley框架定制JsonRequest添加Cookie
- Android Volley框架定制JsonRequest添加Cookie
- Android高级之Volley框架(二):JsonRequest
- Android volley添加Cookie
- Android volley添加Cookie
- Volley之Post JsonRequest
- Android Volley框架定制PostUploadRequest上传文件(图片)
- Android Volley框架定制PostUploadRequest上传文件(图片)
- Android自定义JsonRequest
- Volley关于添加Cookie总结
- JSONRequest
- android - Volley框架请求获取Cookie和带Cookie请求链接和带参数Params
- Android Studio 添加 Volley开源网络框架
- Android HTTP网络通信(三):Volley框架——定制Request
- Android 谷歌 开源 通信框架 VOLLEY(四)——定制请求
- android-Volley框架简介
- android的volley框架
- Android Volley框架使用
- 机器学习-决策树算法
- Android -- Activity,Fragment切换动画。
- C++ 将时间戳转换成标准时间
- 【数论 Day2】基础归纳法 题目
- Gradle中的主要对象
- Android Volley框架定制JsonRequest添加Cookie
- CSS选择器汇总
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.7-4.2.9)
- 有序广播
- python 输出编码错误问题
- 消除疲劳八法
- sql常见函数
- 【数论 Day2】基础归纳法 题解
- python014 -- 常用内建函数