如何让 cURL 自动将接收到的 cookie 添加到请求中?

How to allow cURL to automatically add recived cookies to the request?

我正在尝试通过 PHP.

使用 cURL 调用与 RESP API 通信

第一次调用 API 是通过传递用户名和密码进行登录。 API 收到我的请求后,它会在 headers

中 returns 类似这样的内容
HTTP/1.1 201 Created
ININ-ICWS-CSRF-Token: WAhtYWxoabcfa1dBY2NvUkRJWCQ2Yzg5YefgOC01YTI0LTQ1MjEtYTdgdd1iMzAyNGRhZmRjZTBYCjEwLjAuNC4xNjA=
ININ-ICWS-Session-ID: 2562886002
Set-Cookie: icws_2562886002=1924Pe25-d47c-4d07-9546-9fcuijfdd0b02; Path=/icws/2562886002
Location: /icws/2562886002/connection
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Content-Type: application/vnd.inin.icws+JSON; charset=utf-8
Date: Thu, 14 May 2015 17:49:20 GMT
Server: HttpPluginHost
Content-Length: 238

现在,除了对 API 的任何其他调用外,header 中返回的 cookie 值也必须包含在新请求中。 (在这种情况下:icws_2562886002=1924Pe25-d47c-4d07-9546-9fcuijfdd0b02

如何配置我的 cURL 调用以自动传回收到的 cookie?

因此,对于每个请求,我都会在 header 中看到 Cookie: icws_2562886002=1924Pe25-d47c-4d07-9546-9fcuijfdd0b02

我知道我可以像这样手动添加它

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Cookie: icws_2562886002=1924Pe25-d47c-4d07-9546-9fcuijfdd0b02'));

但是必须有一种方法让 cURL 自动将 cookie 值添加到请求中。

我也试过添加这个

curl_setopt($ch, CURLOPT_COOKIE, true); 

但是也没用

$cookiesFile = 'cookies.txt';
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiesFile); // write
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiesFile); // read

通常在 302 重定向中设置 cookie。这对 cURL 和 cookies 来说是个问题。如此之多,以至于我编写了自己的 cookie 例程。

当有重定向时,我不允许 cURL 跟随:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

我从 Header 获取 cookie,所以我必须告诉 cURL 提供它:

curl_setopt($ch, CURLOPT_HEADER, true);

执行cURL后

  $data = curl_exec($ch);

获取响应 Header:

  $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
  $responseHeader= substr($data,0,$skip);
  $data =  substr($data,$skip);

获取所有饼干:

  $e = 0;
  while(true){
    $s = strpos($responseHeader,'Set-Cookie: ',$e);
    if (!$s){break;}
    $s += 12;
    $e = strpos($responseHeader,';',$s);
    $cookie = substr($responseHeader,$s,$e-$s) ;
    $s = strpos($cookie,'=');
    $key = substr($cookie,0,$s);
    $value = substr($cookie,$s);
    $cookies[$key] = $value;
  }

重建cookies:

 $cookie = '';
 $show = '';
 $delim = '';
 foreach ($cookies as $k => $v){
   $cookie .= "$delim$k$v";
   $delim = '; ';
 }

然后使用:

curl_setopt($ch, CURLOPT_COOKIE, $cookie );

多次使用:

CURLOPT_COOKIEJAR
CURLOPT_COOKIEFILE

Cookie Jar 有很多次不起作用。如果您正在做一些简单的事情,它们就可以正常工作。

当存在重定向或您需要后续请求中的 cookie 时,Cookie Jar 崩溃了。

当您需要来自重定向页面的一些其他数据时,问题尤其严重。我有 运行 以防有一系列多达六个重定向并且 cookie 不断变化的情况。