【问题标题】:Retrieving cookies from response on volley从 volley 的响应中检索 cookie
【发布时间】:2019-08-30 12:12:40
【问题描述】:


我正在使用 Volley 开发 Android,我需要执行 HTTP 请求以获取一些 cookie,我想要 retrieve 的 cookie 不在标头 Set-Cookie 中,而是在 cookie 部分中.

我尝试了 Volley 的所有功能,但无法访问该部分。
有没有办法得到这些饼干?
非常感谢

【问题讨论】:

标签: android android-volley session-cookies


【解决方案1】:
public static void makeJsonObjectRequest(Context context, String url, final VolleyResponseListener listener) {
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
            (url, null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                listener.onResponse(response);
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                listener.onError(error.toString());
            }
        }) {

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
           Map<String, String> responseHeaders = response.headers;
            String yourCookies = responseHeaders.get("Set-Cookie");
            Log.d("cookies",yourCookies);
            return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }
};

// Access the RequestQueue through singleton class.
VolleySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest);
 }

【讨论】:

  • 我提到cookies不在标头Set-Cookie :) 所以这个方法不起作用。
  • @AbderrahmaneKaciAissa 但是 cookie 在请求(客户端 -> 服务器)和响应(服务器 -> 客户端)中作为 HTTP 标头传递,不是吗?
  • 如我的问题所示,使用邮递员,我在 cookie 选项卡中收到了 cookie,同时,我在标题中没有 Cookie,所以我想知道如何从 java 访问该 cookie 选项卡。
  • 你能在问题中发布你的代码来提出凌空请求吗?
  • 实际上,我使用的是您给我的相同代码,但是当我检查标头时,不存在 Set-Cookie 标头,所以我假设那些 cookie 不在标头中,现在我是寻找一种方法来提取它们,即使我需要更改库而不使用 volley,我的问题是如何访问该 cookie 部分。
【解决方案2】:

其实如果请求方法是GET。那么下面的例子可能会起作用

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

URL url = new URL("url");

URLConnection connection = url.openConnection();
connection.getContent();

List<HttpCookie> cookies = cookieManager.getCookieStore().getCookies();
for (HttpCookie cookie : cookies) {
    System.out.println(cookie.getDomain());
    System.out.println(cookie);
}

【讨论】:

  • 如果可能的话,你能给我提供 api url 和请求正文,这样我就可以试试了。@AbderrahmaneKaciAissa
【解决方案3】:

终于找到答案了,答案如下:

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

           OkHttpClient.Builder client = new OkHttpClient().newBuilder().cookieJar(new JavaNetCookieJar(manager));

            RequestBody reqbody = RequestBody.create(null, new byte[0]);
            Request request = new Request
                   .Builder()
                   .url(Utility.getRestaurationUrl(context).concat("/login/jwt/"))
                    .method("POST",reqbody)
                   .addHeader("Authorization",token)
                   .build();
            try {
                Response response = client.build().newCall(request).execute();
                List<HttpCookie> cook = manager.getCookieStore().getCookies();
            } catch (IOException e) {
                e.printStackTrace();
            }

必须明确 CookieManager 来自 java.net.CookieManager;

【讨论】:

    【解决方案4】:

    当您拨打您的login api 时,很可能您在第一次尝试时获得了 cookie,而在接下来的尝试中您却无法获得。

    这是因为 cookie 已经存在,但不再出现在标题中。

    您可能希望在第一次调用时保存 cookie,并根据您的生命周期要求在一段时间后刷新它。

    你可以试试用 Postman 看看这个。它是 REST 的绝佳工具。这是link

    另一个可能的原因可能是:

    Cookie 在使用 volley 库时返回 null 或不是预期的结果,因为当你调用它时:

    response.headers.get("Set-Cookie");
    

    响应标头未正确映射。调用

    response.headers
    

    返回一个Map 对象,但它不知道类型。那就是它破裂的地方。因此,更好的方法是首先正确接收Map 对象,如下所示:

    Map<String, String> map = response.headers;
    

    然后:

    String cookie = map.get("Set-Cookie");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2014-07-08
      • 2017-05-09
      相关资源
      最近更新 更多