我访问一个使用名为session_id的变量的REST api服务。 API要求将其存储在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格式返回。由于某种原因,在不引用实际生成的文件的情况下将其传回但未通过安全凭证。关于为什么会这样做的任何更多信息也会有所帮助。
答案 0 :(得分:21)
Cookie是与请求一起发送的简单文本标头。 CURL允许您直接使用CURLOPT_COOKIE
指定它们。
curl_setopt($ch, CURLOPT_COOKIE, 'key=value;anotherkey=anothervalue');
如果你知道要发送什么信息,你可以用这种方式构建自己的cookie头。 COOKIEJAR / COOKIEFILE选项只是自动解析,保存和发送。如果您不想写入文件,则必须手动执行此操作(读取收到的Cookie标头,创建要发送的Cookie标头)。
答案 1 :(得分:8)
这里有一个很好的例子,
http://sgjoomla.googlecode.com/svn/trunk/joomla/curltest.php
出于某种原因,cookie部分已被注释掉,但您需要的所有代码仍然存在。
基本上,你自己解析“Set-Cookie”标题并通过这样做保存cookie值,
curl_setopt ($ch, CURLOPT_HEADERFUNCTION, 'read_header');
将cookie值放在全局中。在下一个电话中,将其设置为这样,
curl_setopt($ch, CURLOPT_COOKIE, "$cookieName=$cookieValue");
答案 2 :(得分:4)
我使用tempnam生成唯一的文件名。
$ckfile = tempnam ("/tmp", "cookieMyWeb");
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile);
在使用curl之前生成新文件名。