【问题标题】:how can i get response cookies with android volley如何使用 android volley 获取响应 cookie
【发布时间】:2023-04-01 19:44:01
【问题描述】:

我在用Volley的android中发送HTTP请求,重点是发送请求的时候,服务器响应一个带有某个key和value的Set-Cookie,

我怎样才能得到这个值?检查浏览器网络我得到以下信息

我想获取这个数值,因为它是后续请求的要求。

这是我当前的代码。

 StringRequest postRequest = new StringRequest(Request.Method.POST, linklogin,
            new Response.Listener<String>()
            {
                @Override
                public void onResponse(String response) {
                    // response
                    Log.d("Response", response);
                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    Log.d("Error.Response", error.getMessage());
                }
            }
    ) {
        @Override
        protected Map<String, String> getParams()
        {
            Map<String, String>  params = new HashMap<String, String>();
            params.put("user", "");
            params.put("pws", "");

            return params;
        }

    };
    queue.add(postRequest);

【问题讨论】:

标签: java android android-volley


【解决方案1】:

创建一个名为 VolleyStringRequest 的新类并粘贴以下代码:

import com.android.volley.AuthFailureError;
import com.android.volley.Header;
import com.android.volley.NetworkResponse;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class VolleyStringRequest implements Response.Listener<String> {
    ResponseListener listener;
    Response.ErrorListener errorListener;
    int method = -1;
    String url;
    List<Header> headers = new ArrayList<>();
    Map<String, String> params;

    @Override
    public void onResponse(String response) {
        if (listener != null) {
            listener.onResponse(response, headers);
        }
    }

    public VolleyStringRequest(int method, String url, ResponseListener listener, Response.ErrorListener errorListener, Map<String, String> params) {
        this.listener = listener;
        this.method = method;
        this.url = url;
        this.errorListener = errorListener;
        this.params = params;

    }

    public VolleyStringRequest(String url, ResponseListener listener, Response.ErrorListener errorListener, Map<String, String> params) {
        this.listener = listener;
        this.url = url;
        this.errorListener = errorListener;
        this.params = params;
    }

    public Request getRequest() {
        if (method == -1) {
            return new Request(url, this, errorListener);
        } else {
            return new Request(method, url, this, errorListener);
        }
    }

    class Request extends StringRequest {

        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            return params;
        }

        public Request(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
            super(method, url, listener, errorListener);
        }

        public Request(String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
            super(url, listener, errorListener);
        }

        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse response) {
            headers.addAll(response.allHeaders);
            return super.parseNetworkResponse(response);
        }
    }

    public interface ResponseListener {
        void onResponse(String response, List<Header> headers);
    }

}

现在如何使用这个类:

Map<String,String> params = new HashMap<>();
        StringRequest request = new VolleyStringRequest(Request.Method.POST,"https://google.com", new VolleyStringRequest.ResponseListener() {
            @Override
            public void onResponse(String response, List<Header> headers) {
//here you get all the headers. do whatever you want with it
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        },params).getRequest();
      queue.add(request);

【讨论】:

  • 感谢您回答奇怪的事情是我无法获得其他人的 Set-Cookie 如果:/
  • @DarkFenix 你能提供网址和凭据吗,我想用这段代码试试
  • 不,它目前是一个私有 URL 并且容易受到影响
  • @Sahil Manchanda 如果我使用的是 JSON 对象请求而不是字符串请求和 POST 方法,如何获取 Set-Cookie?我有一个开放的赏金,请看看这个问题。 stackoverflow.com/questions/54730709/…
【解决方案2】:

我希望这对你有用。

覆盖此方法。

            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                Log.e("response@@", response.headers.toString());
                Map<String, String> responseHeaders = response.headers;
                String cookies = responseHeaders.get("Set-Cookie");
                Log.e("cookies@@", cookies);
                return super.parseNetworkResponse(response);
            }

【讨论】:

  • 用这个方法我得到一个 NullPointerException
猜你喜欢
  • 2018-10-24
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多