2009-12-07 3 views
14

Ich greife auf einen REST-API-Dienst zu, der eine Variable namens session_id verwendet. Die API-Aufrufe für diese in einem Cookie gespeichert werden, und ich erreichen dies wie folgt:PHP mit CURL: gibt es eine Möglichkeit, ein Cookie zu emulieren, anstatt es in einer Datei zu speichern?

$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); 

Nun das Problem ist dies viele Male von vielen verschiedenen Benutzern genannt. (So ​​viele verschiedene Cookie-Dateien müssen gespeichert werden) Ich möchte eine Möglichkeit, die Session-ID einfach in einer Variablen zu speichern, anstatt auf die Cookie-Datei zu verweisen. Bisher werden alle meine Versuche vom Dienst abgelehnt. Kann jemand Methoden vorschlagen, um die Sitzungs-ID und Cookie-Informationen zu speichern, ohne sie in einer Datei zu speichern? Beachten Sie, dass das Lesen der Sitzungs-ID kein Problem darstellt und in XML zurückgegeben wird. Aus irgendeinem Grund werden die Sicherheitsanmeldeinformationen nicht weitergegeben, ohne dass die tatsächlich generierte Datei referenziert wird. Weitere Informationen dazu, warum dies möglich ist, wären ebenfalls hilfreich.

Antwort

22

Cookies sind einfacher Text Header zusammen mit der Anforderung gesendet. Mit CURL können Sie diese direkt unter Verwendung von CURLOPT_COOKIE angeben.

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

Wenn Sie wissen, welche Informationen gesendet werden sollen, können Sie auf diese Weise Ihren eigenen Cookie-Header erstellen. Die COOKIEJAR/COOKIEFILE-Optionen automatisieren einfach das Parsen, Speichern und Senden. Sie müssen das manuell tun (lesen Sie die empfangenen Cookie-Header, erstellen Sie die zu sendenden Cookie-Header), wenn Sie nicht in eine Datei schreiben wollen.

+0

Diese Seite spricht es wirklich zu out http://docstore.mik.ua/orelly/webprog/pcook/ch11_04.htm – Praesagus

4

Ich benutze tempnam einen eindeutigen Dateinamen zu generieren.

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

Erstellen Sie einen neuen Dateinamen, bevor Sie curl verwenden.

8

Es ist ein gutes Beispiel,

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

Aus irgendeinem Grund wird das Cookie Teil kommentiert, sondern der gesamte Code Sie müssen immer noch da.

Grundsätzlich analysieren Sie die "Set-Cookie" Header selbst und die Cookie-Wert speichern, indem Sie diese,

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

Setzen Sie den Cookie-Wert in einem globalen. Im nächsten Anruf, es so eingestellt,