Как поместить идентификатор сеанса cookie в запрос волейбола?

Итак, у меня есть этот код, чтобы сделать запрос POST с волейболом:

public class MainActivity extends AppCompatActivity { Button btnSearch; ProgressDialog loadingDialog; ListView lvResult; String session_id; RequestQueue queue; MyCookieManager myCookieManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnSearch = (Button) findViewById(R.id.btnSearch); lvResult = (ListView) findViewById(R.id.lvResult); loadingDialog = new ProgressDialog(MainActivity.this); loadingDialog.setMessage("Wait.\nLoading..."); loadingDialog.setCancelable(false); myCookieManager = new MyCookieManager(); requestCookie(); //FIRST CALL TO GET SESSION ID btnSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showLoading(); requestWithSomeHttpHeaders(); //CALL TO MAKE THE REQUEST WITH VALID SESSION ID } }); } public void requestCookie() { queue = Volley.newRequestQueue(this); String url = "http://myurl.com/json/"; StringRequest postRequest = new StringRequest(Request.Method.POST, 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(); } } ) { @Override public byte[] getBody() throws AuthFailureError { String httpPostBody = "param1=XPTO&param2=XPTO"; return httpPostBody.getBytes(); } @Override public Map < String, String > getHeaders() throws AuthFailureError { Map <String, String> params = new HashMap < String, String > (); params.put("User-Agent", "Mozilla/5.0"); params.put("Accept", "application/json, text/javascript, */*; q=0.01"); params.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); //params.put("Set-Cookie", session_id);// + " _ga=GA1.3.1300076726.1496455105; _gid=GA1.3.1624400465.1496455105; _gat=1; _gali=AguardeButton"); //"PHPSESSID=ra0nbm0l22gsnl6s4jo0qkqci1"); return params; } 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(postRequest); } public void requestWithSomeHttpHeaders() { queue = Volley.newRequestQueue(this); String url = "http://myurl.com/json/"; StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener <String> () { @Override public void onResponse(String response) { Log.d("Response", response); String x = myCookieManager.getCookieValue(); String status = ""; try { JSONObject resultObject = new JSONObject(response); Log.d("JSON RESULT =>", resultObject.toString()); } catch (JSONException e) { Toast.makeText(MainActivity.this, "Request Error", Toast.LENGTH_SHORT).show(); e.printStackTrace(); } hideLoading(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("ERROR", "Error => " + error.toString()); hideLoading(); } } ) { @Override public byte[] getBody() throws AuthFailureError { String httpPostBody = "param1=XPTO&param2=XPTO"; return httpPostBody.getBytes(); } @Override public Map <String, String> getHeaders() throws AuthFailureError { Map <String, String> params = new HashMap <String, String> (); params.put("User-Agent", "Mozilla/5.0"); params.put("Accept", "application/json, text/javascript, */*; q=0.01"); params.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); params.put("Cookie", /*myCookieManager.getCookieValue()*/ session_id + "; _ga=GA1.3.1300076726.1496455105; _gid=GA1.3.1624400465.1496455105; _gat=1; _gali=AguardeButton"); return params; } }; queue.add(postRequest); } private void showLoading() { runOnUiThread(new Runnable() { @Override public void run() { if (!loadingDialog.isShowing()) loadingDialog.show(); } }); } private void hideLoading() { runOnUiThread(new Runnable() { @Override public void run() { if (loadingDialog.isShowing()) loadingDialog.dismiss(); } }); } } 

Если я отправлю действительный идентификатор файла cookie, это вернет действительный объект JSON иначе, чем пустой объект.

Я попытался (безуспешно) установить дескрипторы cookie по умолчанию, например

CookieManager manager = new CookieManager(); CookieHandler.setDefault(manager);

Но я получаю пустой объект.

Как установить действительный идентификатор сеанса cookie для отправки запроса?

Solutions Collecting From Web of "Как поместить идентификатор сеанса cookie в запрос волейбола?"

Поэтому проблема заключалась в получении действительного файла cookie. Моя ошибка заключалась в том, чтобы получить его из самого запроса POST. Я придерживался одного и того же принципа работы, получая файл cookie при запуске приложения, но используя GET вместо POST и вызывая корень URL вместо адреса, где я получаю JSON.

Мое решение выглядело так:

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

Использование файлов cookie с Android-библиотекой volley

Класс запроса:

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

Вы получаете cookie (идентификатор сеанса) в ответе Login, сохраняете cookie в sharedpreference или другом db и используете это для отправки запроса.

Для получения cookie из запроса на вход

  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

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

Установить cookie при добавлении запроса на сервер.

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