How to put Cookie session id into volley request?
So the problem was getting a valid cookie. My mistake was to get it from the POST request itself. I kept the same working principle, getting the cookie when I started the application but using GET instead of POST and calling the root of the URL instead of the address where I get the JSON.
My solution looked like this:
public void requestCookie() { queue = Volley.newRequestQueue(this); String url = "http://myurl.com/"; StringRequest getRequest = new StringRequest(Request.Method.GET, url, new Response.Listener <String> () { @Override public void onResponse(String response) { String x = myCookieManager.getCookieValue(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("ERROR", "Error => " + error.toString()); hideLoading(); } } ) { protected Response <String> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); String header_response = String.valueOf(response.headers.values()); int index1 = header_response.indexOf("PHPSESSID="); int index2 = header_response.indexOf("; path"); //Log.e(Utils.tag, "error is : " + index1 + "::" + index2); session_id = header_response.substring(index1, index2); return Response.success(jsonString, HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } } }; queue.add(getRequest); }
Using cookies with Android volley library
Request class:
public class StringRequest extends com.android.volley.toolbox.StringRequest { private final Map<String, String> _params; /** * @param method * @param url * @param params * A {@link HashMap} to post with the request. Null is allowed * and indicates no parameters will be posted along with request. * @param listener * @param errorListener */ public StringRequest(int method, String url, Map<String, String> params, Listener<String> listener, ErrorListener errorListener) { super(method, url, listener, errorListener); _params = params; } @Override protected Map<String, String> getParams() { return _params; } /* (non-Javadoc) * @see com.android.volley.toolbox.StringRequest#parseNetworkResponse(com.android.volley.NetworkResponse) */ @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { // since we don't know which of the two underlying network vehicles // will Volley use, we have to handle and store session cookies manually MyApp.get().checkSessionCookie(response.headers); return super.parseNetworkResponse(response); } /* (non-Javadoc) * @see com.android.volley.Request#getHeaders() */ @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = super.getHeaders(); if (headers == null || headers.equals(Collections.emptyMap())) { headers = new HashMap<String, String>(); } MyApp.get().addSessionCookie(headers); return headers; }}
MyApp:
public class MyApp extends Application { private static final String SET_COOKIE_KEY = "Set-Cookie"; private static final String COOKIE_KEY = "Cookie"; private static final String SESSION_COOKIE = "sessionid"; private static MyApp _instance; private RequestQueue _requestQueue; private SharedPreferences _preferences; public static MyApp get() { return _instance; } @Override public void onCreate() { super.onCreate(); _instance = this; _preferences = PreferenceManager.getDefaultSharedPreferences(this); _requestQueue = Volley.newRequestQueue(this); } public RequestQueue getRequestQueue() { return _requestQueue; } /** * Checks the response headers for session cookie and saves it * if it finds it. * @param headers Response Headers. */ public final void checkSessionCookie(Map<String, String> headers) { if (headers.containsKey(SET_COOKIE_KEY) && headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)) { String cookie = headers.get(SET_COOKIE_KEY); if (cookie.length() > 0) { String[] splitCookie = cookie.split(";"); String[] splitSessionId = splitCookie[0].split("="); cookie = splitSessionId[1]; Editor prefEditor = _preferences.edit(); prefEditor.putString(SESSION_COOKIE, cookie); prefEditor.commit(); } } } /** * Adds session cookie to headers if exists. * @param headers */ public final void addSessionCookie(Map<String, String> headers) { String sessionId = _preferences.getString(SESSION_COOKIE, ""); if (sessionId.length() > 0) { StringBuilder builder = new StringBuilder(); builder.append(SESSION_COOKIE); builder.append("="); builder.append(sessionId); if (headers.containsKey(COOKIE_KEY)) { builder.append("; "); builder.append(headers.get(COOKIE_KEY)); } headers.put(COOKIE_KEY, builder.toString()); } }}
You getting cookie (Session id) in Login response, Save cookie in sharedpreference or other db, and use that to send in request.
for getting cookie from login request
CustomStringRequest stringRequest = new CustomStringRequest(Request.Method.POST, SIGN_IN_URL, new Response.Listener<CustomStringRequest.ResponseM>() { @Override public void onResponse(CustomStringRequest.ResponseM result) { CookieManager cookieManage = new CookieManager(); CookieHandler.setDefault(cookieManage); progressDialog.hide(); try { //From here you will get headers String sessionId = result.headers.get("Set-Cookie"); String responseString = result.response; Log.e("session", sessionId); Log.e("responseString", responseString); JSONObject object = new JSONObject(responseString);
CustomStringRequest class
public class CustomStringRequest extends Request<CustomStringRequest.ResponseM> { private Response.Listener<CustomStringRequest.ResponseM> mListener; public CustomStringRequest(int method, String url, Response.Listener<CustomStringRequest.ResponseM> responseListener, Response.ErrorListener listener) { super(method, url, listener); this.mListener = responseListener; } @Override protected void deliverResponse(ResponseM response) { this.mListener.onResponse(response); } @Override protected Response<ResponseM> parseNetworkResponse(NetworkResponse response) { String parsed; try { parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); } catch (UnsupportedEncodingException e) { parsed = new String(response.data); } ResponseM responseM = new ResponseM(); responseM.headers = response.headers; responseM.response = parsed; return Response.success(responseM, HttpHeaderParser.parseCacheHeaders(response)); } public static class ResponseM { public Map<String, String> headers; public String response; }}
set cookie when add request to server..
@Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<String, String>(); String session=sharedPreferences.getString("sessionId",""); headers.put("Cookie",session); return headers; }