2014-07-01 277 views
1

我試圖發送一個多curl請求到api以檢索數據。這個特定的api需要一個正確的JSESSIONID cookie傳遞到頭文件中才能正常工作。JSESSIONID PHP Curl請求

功能我使用的發送請求是:

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客戶端谷歌瀏覽器擴展程序,當我使用擴展名傳遞的Cookie請求標題時,該功能起作用。但是,api憑證會過期,所以我需要編程創建並使用JSESSIONID。

據我所知,我必須使用捲曲選擇COOKIEJAR和COOKIE莫名其妙,但我不太確定,因爲我是新手。

回答

1

當您試圖模擬新會話的開始時,您只使用CURLOPT_COOKIESESSION。通過這樣做,cURL不會從cookie jar /文件加載任何會話cookie。

您還需要指定cookie jar文件通過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]); 

} 

你不應該手動設置你的會話cookie的值。

+0

這將如何幫助我創建一個名爲'JSESSIONID'的Cookie? – Karthik

+0

@Karthik您不需要創建cookie,遠程服務器會根據您的第一次會話請求發送cookie。該cookie被存儲在cookie jar中,並會隨後的請求自動發送。 –

+0

我正在使用的API的文檔說我必須在標題上提供JSESSIONID cookie。將創建CookieJar爲我做這個? – Karthik