JSESSIONID-PHP-Curl请求

JSESSIONID-PHP-Curl请求,php,cookies,curl,jsessionid,curl-multi,Php,Cookies,Curl,Jsessionid,Curl Multi,我试图向api发送一个multi-curl请求以检索数据。此特定api需要将正确的JSESSIONID cookie传递到头中,以使其正常工作 我用来发送请求的功能是: function sendMultiRequest($data) { // initialize array of curl handles $curl_handles = array(); // returned data $result = array(); // initiali

我试图向api发送一个multi-curl请求以检索数据。此特定api需要将正确的JSESSIONID cookie传递到头中,以使其正常工作

我用来发送请求的功能是:

function sendMultiRequest($data) {

    // initialize array of curl handles
    $curl_handles = array();
    // returned data
    $result = array();

    // initialize multi handle
    $multi_handle = curl_multi_init();

    //$cookie = generateCookie();

    $headers = array(
        'Content-type: application/json',
        'Cookie: JSESSIONID=39DDF47143F20CA952555027CD5F5EA2'
    );

    // loop through $data and create curl handles
    // then add them to the multi-handle
    foreach ($data as $key => $val) {

        $curl_handles[$key] = curl_init();

        curl_setopt($curl_handles[$key], CURLOPT_URL, $val);
        curl_setopt($curl_handles[$key], CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl_handles[$key], CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($curl_handles[$key], CURLOPT_COOKIESESSION, TRUE);


        curl_multi_add_handle($multi_handle, $curl_handles[$key]);

    }

    // execute the handles
    $running = null;
    do {
        curl_multi_exec($multi_handle, $running);
    } while($running > 0);


    // get content and remove handles
    foreach($curl_handles as $key => $val) {
        $result[$key] = json_decode(curl_multi_getcontent($val), TRUE);
        curl_multi_remove_handle($multi_handle, $val);

    }

    // close curl_multi
    curl_multi_close($multi_handle);

    return $result;
}
我不认为这是函数问题,因为我的其他多个请求可以工作。但是当我尝试访问api时,我不知道;除非传入正确的JSESSIONID,否则无法获取数据

我知道这一点,因为我目前正在使用高级REST客户端Google Chrome扩展,当我使用扩展传递的Cookie请求头时,该函数就工作了。但是,api凭据将过期,因此我需要以编程方式创建和使用JSESSIONID


我知道我必须以某种方式使用curl-opt-COOKIEJAR和COOKIE,但我不太确定,因为我是新手。

您仅在尝试模拟新会话开始时使用
curl-opt\u-COOKIESESSION
。通过执行此操作,cURL将不会从cookie jar/文件加载任何会话cookie

您还需要通过
CURLOPT_COOKIEJAR

因此,以您的示例为基础:

// then add them to the multi-handle
foreach ($data as $key => $val) {

    $curl_handles[$key] = curl_init();

    curl_setopt($curl_handles[$key], CURLOPT_URL, $val);
    curl_setopt($curl_handles[$key], CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl_handles[$key], CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl_handles[$key], CURLOPT_COOKIEJAR, '/path/to/cookie/file');
    // do this only if you need to force a new session and not load session cookie from cookie jar
    curl_setopt($curl_handles[$key], CURLOPT_COOKIESESSION, TRUE);


    curl_multi_add_handle($multi_handle, $curl_handles[$key]);

}

您不必手动设置会话id cookie值。

这将如何帮助我创建名为“JSESSIONID”的cookie?@Karthik您无需创建cookie远程服务器在您首次请求会话时发送cookie。该cookie存储在cookie jar中,并将与后续请求一起自动发送。创建CookieJar会帮我做到这一点吗?@Karthik在第一次调用服务启动会话之前,如何获取会话ID?会话通常由服务器启动,并通过cookie传播。是否需要先调用一些API来启动会话?@Karthik听起来像是API所有者的问题。我从未使用过客户端指定其会话ID的服务。这将是非常不寻常的,并且可能不安全。