Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从截取JSON对象POST方法响应中捕获cookie_Java_Android_Json_Cookies_Android Volley - Fatal编程技术网

Java 从截取JSON对象POST方法响应中捕获cookie

Java 从截取JSON对象POST方法响应中捕获cookie,java,android,json,cookies,android-volley,Java,Android,Json,Cookies,Android Volley,我正在使用android上的截击库发送POST请求。一旦我得到json响应,服务器就会在头中发送回一个cookie。当我使用android studio中的探查器检查网络流量时,我可以看到cookie 我需要能够从标题中获取cookie并将其分配给变量,以便将其传递给下一个活动 我看过 及 他们都有好几岁了,我无法让他们工作。我不确定这是否是因为他们使用GET请求,而我的是POST请求 有没有一种简单的方法可以从服务器响应中获取cookie 这是我目前拥有的代码,除了抓取cookie,一切都很好

我正在使用android上的截击库发送POST请求。一旦我得到json响应,服务器就会在头中发送回一个cookie。当我使用android studio中的探查器检查网络流量时,我可以看到cookie

我需要能够从标题中获取cookie并将其分配给变量,以便将其传递给下一个活动

我看过 及

他们都有好几岁了,我无法让他们工作。我不确定这是否是因为他们使用GET请求,而我的是POST请求

有没有一种简单的方法可以从服务器响应中获取cookie

这是我目前拥有的代码,除了抓取cookie,一切都很好

 JsonObjectRequest postRequest = new JsonObjectRequest(Request.Method.POST, cartUrl, jsonParams,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    //Obviously this will not work becuase .getCookie() requires a url as a parameter
                    //There must be a method something like this to capture the response and get the cookie.
                    String chocolateChip = CookieManager.getInstance().getCookie(response);

                    startActivity(postIntent);

                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    postRequestQue.add(postRequest);

}
JsonObjectRequest postRequest=新的JsonObjectRequest(Request.Method.POST、cartUrl、jsonParams、,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
//显然,这不起作用,因为.getCookie()需要一个url作为参数
//必须有这样的方法来捕获响应并获取cookie。
字符串chocolateChip=CookieManager.getInstance().getCookie(响应);
起始触觉(postinent);
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
}
});
postRequestQue.add(postRequest);
}
您是否检查了同一个问题?这是一个可接受的答案,显示了从响应中捕获cookie并随后通过在后续请求中添加cookie来发送cookie所需的实现

另外,请检查以下屏幕截图。我把它从你那里拿走了。

编辑: 我理解这个问题。你能试试这个答案吗。 下面的链接解释了
HttpURLConnection
cookies的用法

您还可以尝试将以下参数添加到
CookieManager
构造函数以接受所有cookie:

CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
你问过同样的问题吗?这是一个可接受的答案,显示了从响应中捕获cookie并随后通过在后续请求中添加cookie来发送cookie所需的实现

另外,请检查以下屏幕截图。我把它从你那里拿走了。

编辑: 我理解这个问题。你能试试这个答案吗。 下面的链接解释了
HttpURLConnection
cookies的用法

您还可以尝试将以下参数添加到
CookieManager
构造函数以接受所有cookie:

CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
试试这个-

            @Override
            public String getBodyContentType() {
                return "application/json";
            }

            @Override
                protected Response<JSONObject> 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
                    Log.i("response",response.headers.toString());
                    Map<String, String> responseHeaders = response.headers;
                    String rawCookies = responseHeaders.get("Set-Cookie");
                    Log.i("cookies",rawCookies);
                    prefLogin.setSessionId(rawCookies); // save your cookies using shared prefernece
                    return super.parseNetworkResponse(response);
                }
@覆盖
公共字符串getBodyContentType(){
返回“application/json”;
}
@凌驾
受保护的响应parseNetworkResponse(NetworkResponse响应){
//因为我们不知道两个底层网络载体中的哪一个
//如果要使用截击,我们必须手动处理和存储会话cookie
Log.i(“response”,response.headers.toString());
Map responseHeaders=response.headers;
String rawCookies=responseHeaders.get(“设置Cookie”);
Log.i(“cookies”,rawCookies);
prefLogin.setSessionId(rawCookies);//使用共享首选项保存cookies
返回super.parseNetworkResponse(response);
}
试试这个-

            @Override
            public String getBodyContentType() {
                return "application/json";
            }

            @Override
                protected Response<JSONObject> 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
                    Log.i("response",response.headers.toString());
                    Map<String, String> responseHeaders = response.headers;
                    String rawCookies = responseHeaders.get("Set-Cookie");
                    Log.i("cookies",rawCookies);
                    prefLogin.setSessionId(rawCookies); // save your cookies using shared prefernece
                    return super.parseNetworkResponse(response);
                }
@覆盖
公共字符串getBodyContentType(){
返回“application/json”;
}
@凌驾
受保护的响应parseNetworkResponse(NetworkResponse响应){
//因为我们不知道两个底层网络载体中的哪一个
//如果要使用截击,我们必须手动处理和存储会话cookie
Log.i(“response”,response.headers.toString());
Map responseHeaders=response.headers;
String rawCookies=responseHeaders.get(“设置Cookie”);
Log.i(“cookies”,rawCookies);
prefLogin.setSessionId(rawCookies);//使用共享首选项保存cookies
返回super.parseNetworkResponse(response);
}
输出:(URL:)

注意:请使用privateLabelId进行尝试,因为以下输出是HTTP 400请求的结果

{
  "error": {
    "statusCode": 400,
    "name": "invalid-product",
    "message": "Bad Request. Invalid {productId} in {items}"
  }
}
标题

com.example.test E/MainActivity: Name Access-Control-Allow-Credentials Value true
com.example.test E/MainActivity: Name Cache-Control Value max-age=0, no-cache, no-store
com.example.test E/MainActivity: Name Connection Value close
com.example.test E/MainActivity: Name Content-Length Value 109
com.example.test E/MainActivity: Name Content-Type Value application/json; charset=utf-8
com.example.test E/MainActivity: Name Date Value Thu, 21 Feb 2019 06:09:34 GMT
com.example.test E/MainActivity: Name Expires Value Thu, 21 Feb 2019 06:09:34 GMT
com.example.test E/MainActivity: Name P3P Value CP="IDC DSP COR LAW CUR ADM DEV TAI PSA PSD IVA IVD HIS OUR SAM PUB LEG UNI COM NAV STA"
com.example.test E/MainActivity: Name Pragma Value no-cache
com.example.test E/MainActivity: Name Server Value nginx
com.example.test E/MainActivity: Name Vary Value Origin, Accept-Encoding
com.example.test E/MainActivity: Name X-Android-Received-Millis Value 1550729374476
com.example.test E/MainActivity: Name X-Android-Response-Source Value NETWORK 400
com.example.test E/MainActivity: Name X-Android-Selected-Protocol Value http/1.1
com.example.test E/MainActivity: Name X-Android-Sent-Millis Value 1550729373659
com.example.test E/MainActivity: Name X-ARC Value 102
com.example.test E/MainActivity: Name X-Content-Type-Options Value nosniff
com.example.test E/MainActivity: Name X-Download-Options Value noopen
com.example.test E/MainActivity: Name X-Frame-Options Value DENY
com.example.test E/MainActivity: Name X-XSS-Protection Value 1; mode=block
类截击请求

import android.util.Log;
import android.support.annotation.Nullable;

import com.android.volley.Header;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.JsonRequest;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

class VolleyJsonRequest {
    private ResponseListener listener;
    private int method;
    private String url;
    private List<Header> headers = new ArrayList<>();
    private JSONObject body;
    private int statusCode;

    private static final String TAG = VolleyJsonRequest.class.getSimpleName();

    public VolleyJsonRequest(int method, String url, JSONObject body, ResponseListener listener) {
        this.listener = listener;
        this.method = method;
        this.url = url;
        this.body = body;

    }

    public Request get() {
        return new Request(method, url, body.toString(), responseListener, errorListener);
    }

    Response.Listener<String> responseListener = new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            deliverResult(response);
        }
    };

    Response.ErrorListener errorListener = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            statusCode = error.networkResponse.statusCode;
            headers.addAll(error.networkResponse.allHeaders);
            String json;
            try {
                json = new String(
                        error.networkResponse.data,
                        HttpHeaderParser.parseCharset(error.networkResponse.headers));
                deliverResult(json);
            } catch (
                    UnsupportedEncodingException e) {
                Log.e(TAG, Log.getStackTraceString(e));
            }
        }
    };


    private void deliverResult(String response) {
        try {
            Object object = new JSONTokener(response).nextValue();
            if (object instanceof JSONObject) {
                listener.onResponse(statusCode, headers, (JSONObject) object, null);
            } else {
                listener.onResponse(statusCode, headers, null, (JSONArray) object);
            }
        } catch (JSONException e) {
            Log.e(TAG, Log.getStackTraceString(e));
        }
    }


    class Request extends JsonRequest {

        public Request(int method, String url, @Nullable String requestBody, Response.Listener listener, @Nullable Response.ErrorListener errorListener) {
            super(method, url, requestBody, listener, errorListener);
        }

        @Override
        protected Response parseNetworkResponse(NetworkResponse response) {
            headers.addAll(response.allHeaders);
            statusCode = response.statusCode;
            String string;
            try {
                string = new String(
                        response.data,
                        HttpHeaderParser.parseCharset(response.headers));
            } catch (
                    UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            }

            return Response.success(
                    string,
                    HttpHeaderParser.parseCacheHeaders(response));

        }
    }

    public interface ResponseListener {
        void onResponse(int statusCode, List<Header> headers, JSONObject object, JSONArray array);
    }

}
导入android.util.Log;
导入android.support.annotation.Nullable;
导入com.android.volley.Header;
导入com.android.volley.NetworkResponse;
导入com.android.volley.ParseError;
导入com.android.volley.Response;
导入com.android.volley.VolleyError;
导入com.android.volley.toolbox.HttpHeaderParser;
导入com.android.volley.toolbox.JsonRequest;
导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
导入org.json.JSONTokener;
导入java.io.UnsupportedEncodingException;
导入java.util.ArrayList;
导入java.util.List;
类截击JSONRequest{
私人回应者、聆听者;
私有int方法;
私有字符串url;
私有列表头=新的ArrayList();
私有JSONObject主体;
专用int状态码;
私有静态最终字符串标记=VolleyJsonRequest.class.getSimpleName();
公共截击JSONRequest(int方法、字符串url、JSONObject主体、ResponseListener侦听器){
this.listener=listener;
这个方法=方法;
this.url=url;
这个身体=身体;
}
公共请求get(){
返回新请求(方法、url、body.toString()、responseListener、errorListener);
}
Response.Listener responseListener=新的Response.Listener(){
@凌驾
公共v