2009-12-07 66 views
14

我訪問使用名爲session_id的變量的REST api服務。這樣做的API調用存儲在cookie中,我做到這一點,如下所示:使用CURL的PHP​​:有沒有一種方法來模擬cookie而不是將其保存到文件中?

$ch = curl_init(); // initialize curl handle 

     curl_setopt($ch, CURLOPT_URL, $url); //set target URL 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);// allow redirects 
     curl_setopt($ch, CURLOPT_COOKIEFILE, './Cookie.txt'); 
     curl_setopt($ch, CURLOPT_COOKIEJAR, './Cookie.txt'); 
     curl_setopt($ch, CURLOPT_POST, TRUE); // set POST method 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //set headers 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
     curl_setopt($ch, CURLOPT_HEADER, TRUE); //return the headers so we can get session id 
     curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //prevent unverified SSL certificate error 
     curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //prevent unverified SSL "" 

     $contents = curl_exec($ch); 
     curl_close($ch); 

現在的問題是,這是由許多不同的用戶名爲許多不同的時間。 (這麼多不同的cookie文件必須保存)我想要一種方式來簡單地將session_id存儲在變量中而不是引用cookie文件。到目前爲止,我所有的嘗試都被服務拒絕。任何人都可以建議方法來存儲會話ID和Cookie信息,而不保存到文件?請注意,閱讀會話ID是沒有問題的,它以XML返回。出於某種原因傳遞它而不引用實際生成的文件不會傳遞安全憑證。關於這可能是爲什麼的更多信息也會有所幫助。

回答

22

Cookie是與請求一起發送的簡單文本標頭。 CURL允許您指定那些直接使用CURLOPT_COOKIE

curl_setopt($ch, CURLOPT_COOKIE, 'key=value;anotherkey=anothervalue'); 

如果您知道要發送什麼信息,您可以用這種方式構建自己的cookie標頭。 COOKIEJAR/COOKIEFILE選項只是自動解析,保存和發送。如果您不想寫入文件,則必須手動執行此操作(讀取收到的Cookie標頭,創建要發送的Cookie標頭)。

+0

此網站真的拼出來了http://docstore.mik.ua/orelly/webprog/pcook/ch11_04.htm – Praesagus 2016-09-29 16:57:44

4

我使用tempnam來生成一個唯一的文件名。

$ckfile = tempnam ("/tmp", "cookieMyWeb"); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 

使用curl之前生成一個新的文件名。

8

這裏有一個很好的例子,

http://sgjoomla.googlecode.com/svn/trunk/joomla/curltest.php

出於某種原因,該cookie部分被註釋掉,但所有你需要的代碼仍然存在。

基本上,你自己解析「設置Cookie」頭,並通過這樣做,保存cookie值,

curl_setopt ($ch, CURLOPT_HEADERFUNCTION, 'read_header'); 

把cookie值在全球性的。在下次通話中,將其設置爲這樣,

相關問題