封裝Volley使Volley的每個請求都自動儲存和傳送Cookie
思路很簡單,每次請求獲取到伺服器返回的response就解析頭部獲取cookie並儲存,傳送請求的時候就從本地讀取cookie新增到頭部傳送給伺服器
第一步,解析http response頭部的cookie並儲存,自定義一個Request並重寫其parseNetworkResponse方法
/** * 解析資料,儲存Cookie * @param response * @return */ @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { JSONObject jsonObject; /*將response構造成JSONObject返回給呼叫者*/ if (response.data.length != 0) { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); jsonObject = new JSONObject(jsonString); } else { jsonObject = new JSONObject(); } /*獲取資料頭*/ mHeader = response.headers.toString(); /*通過正規表示式提取Cookie(JSESSIONID)*/ Pattern pattern = Pattern.compile("Set-Cookie=.*?;"); Matcher matcher = pattern.matcher(mHeader); if (matcher.find()) { cookieFromResp = matcher.group(); /*獲取資料頭中鍵為Set-Cookie的值即獲取Cookie*/ cookieFromResp = cookieFromResp.substring(11, cookieFromResp.length() - 1); DLog.v("Cookie: " + cookieFromResp); } /*將Cookie儲存到本地,下次請求資料的時候再把本地儲存的Cookie傳送給伺服器*/ if(!TextUtils.isEmpty(cookieFromResp)){ CookieUtils.saveSessionID(App.getContext(),cookieFromResp); } 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)); } }第二步,傳送請求的時候,從本地讀取Cookie,新增到http request的頭部,傳送給伺服器,重寫getHeaders()即可
/** * 設定header,自動傳送本地儲存的Cookie * @return * @throws AuthFailureError */ @Override public Map<String, String> getHeaders() throws AuthFailureError { headerMap.put("Accept", "application/json"); headerMap.put("Content-Type", "application/json; charset=UTF-8"); String cookie=CookieUtils.loadSessionID(App.getContext()); DLog.d(cookie); /*將本地儲存的Cookie傳送給伺服器*/ if(!TextUtils.isEmpty(cookie)){ headerMap.put("Cookie", CookieUtils.loadSessionID(App.getContext())); } return headerMap; }經過上邊兩個方法的重寫就已經實現了Cookie的自動儲存和自動傳送
經過封裝的完整的Request程式碼如下:
public class JsonObjectRequest extends JsonRequest<JSONObject > {
private String mHeader;
private String cookieFromResp = "";
Map<String, String> headerMap = new HashMap<>();
public JsonObjectRequest(int method, String url,
JSONObject jsonRequest,
Response.Listener<JSONObject> listener,
Response.ErrorListener errorListener) {
super( method,
url,
(jsonRequest == null) ? null : jsonRequest.toString(),
listener,
errorListener);
}
public JsonObjectRequest(String url,
JSONObject jsonRequest,
Response.Listener<JSONObject> listener,
Response.ErrorListener errorListener) {
this( jsonRequest == null ? Request.Method.GET : Request.Method.POST,
url,
jsonRequest,
listener,
errorListener);
}
/**
* 解析資料,儲存Cookie
* @param response
* @return
*/
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
JSONObject jsonObject;
/*將response構造成JSONObject返回給呼叫者*/
if (response.data.length != 0) {
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
jsonObject = new JSONObject(jsonString);
} else {
jsonObject = new JSONObject();
}
/*獲取資料頭*/
mHeader = response.headers.toString();
/*通過正規表示式提取Cookie(JSESSIONID)*/
Pattern pattern = Pattern.compile("Set-Cookie=.*?;");
Matcher matcher = pattern.matcher(mHeader);
if (matcher.find()) {
cookieFromResp = matcher.group();
/*獲取資料頭中鍵為Set-Cookie的值即獲取Cookie*/
cookieFromResp = cookieFromResp.substring(11, cookieFromResp.length() - 1);
DLog.v("Cookie: " + cookieFromResp);
}
/*將Cookie儲存到本地,下次請求資料的時候再把本地儲存的Cookie傳送給伺服器*/
if(!TextUtils.isEmpty(cookieFromResp)){
CookieUtils.saveSessionID(App.getContext(),cookieFromResp);
}
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));
}
}
/**
* 設定超時
* @return
*/
@Override
public RetryPolicy getRetryPolicy() {
RetryPolicy retryPolicy= new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
return retryPolicy;
}
/**
* 設定header,自動傳送本地儲存的Cookie
* @return
* @throws AuthFailureError
*/
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
headerMap.put("Accept", "application/json");
headerMap.put("Content-Type", "application/json; charset=UTF-8");
String cookie=CookieUtils.loadSessionID(App.getContext());
DLog.d(cookie);
/*將本地儲存的Cookie傳送給伺服器*/
if(!TextUtils.isEmpty(cookie)){
headerMap.put("Cookie", CookieUtils.loadSessionID(App.getContext()));
}
return headerMap;
}
//將Cookie加入資料頭
public void setCookie(String cookie) {
headerMap.put("Cookie", cookie);
}
}
相關文章
- Volley傳送簡單的網路請求(Sending a Simple Request)
- post 封裝Map 傳送請求封裝
- Volley 原始碼解析之圖片請求原始碼
- Volley 原始碼解析之網路請求原始碼
- Android網路請求(4) 網路請求框架VolleyAndroid框架
- volley建立請求佇列(Setting Up a RequestQueue)佇列
- Android Volley 非同步網路請求分析Android非同步
- android volley解析與二次封裝Android封裝
- volley建立標準的網路請求(Making a Standard Request)
- Volley 網路請求框架介紹與使用說明框架
- Volley 知識梳理 Volley解析
- Android每週一輪子:VolleyAndroid
- Volley介紹JSon 和提交字串引數的封裝(StringRequest和Gson)JSON字串封裝
- Android Volley 原始碼解析(一),網路請求的執行流程Android原始碼
- Volley實現自定義的網路請求Implementing a Custom Request
- java傳送GET和post請求Java
- PHP傳送POST和GET請求PHP
- 對Volley框架的一些介面進行封裝:VolleyAir框架封裝AI
- Vue中封裝axios傳送請求Vue封裝iOS
- 實現傳送多個Ajax請求
- 【python介面自動化】- 使用requests庫傳送http請求PythonHTTP
- python+pytest介面自動化傳送post請求Python
- Android 使Volley完美支援自定義證書的HttpsAndroidHTTP
- Postman傳送Post請求Postman
- Java傳送Post請求Java
- 傳送GET請求 示例
- HttpClient--傳送請求HTTPclient
- perl傳送http請求HTTP
- java傳送http請求JavaHTTP
- Volley的原理解析
- Postman傳送請求引數是Map格式的請求Postman
- 自動儲存、靜態儲存和動態儲存
- python+pytest介面自動化(4)-requests傳送get請求Python
- 如何傳送請求以及AJAX
- C# 傳送POST請求C#
- 使用HttpClient傳送GET請求HTTPclient
- 使用httpclient傳送http請求HTTPclient
- SpringMVC中如何傳送GET請求、POST請求、PUT請求、DELETE請求。SpringMVCdelete