Php 如何允许cURL自动将收到的cookie添加到请求中?

Php 如何允许cURL自动将收到的cookie添加到请求中?,php,api,rest,curl,icws,Php,Api,Rest,Curl,Icws,我试图通过PHP使用cURL调用与RESP API通信 对API的第一个调用是通过传递用户名和密码进行登录。一旦API收到我的请求,它就会在头文件中返回类似的内容 HTTP/1.1 201 Created ININ-ICWS-CSRF-Token: WAhtYWxoabcfa1dBY2NvUkRJWCQ2Yzg5YefgOC01YTI0LTQ1MjEtYTdgdd1iMzAyNGRhZmRjZTBYCjEwLjAuNC4xNjA= ININ-ICWS-Session-ID: 2562886002

我试图通过PHP使用cURL调用与RESP API通信

对API的第一个调用是通过传递用户名和密码进行登录。一旦API收到我的请求,它就会在头文件中返回类似的内容

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的任何附加调用外,头中返回的cookie值必须包含在新请求中。(在这种情况下:
icws_2562886002=1924Pe25-d47c-4d07-9546-9fcuijfdd0b02

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

因此,对于每个请求,我都会看到标题中有
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); 

但是也不起作用

通常cookies是在302重定向中设置的。这对于卷曲和曲奇来说是个问题。所以我写了自己的cookie例程

$cookiesFile = 'cookies.txt';
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiesFile); // write
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiesFile); // read
当存在重定向时,我不允许cURL跟随:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
我从标题中获取cookies,因此我必须告诉cURL:

curl_setopt($ch, CURLOPT_HEADER, true);
执行cURL之后

  $data = curl_exec($ch);
获取响应标题:

  $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;
  }
 $cookie = '';
 $show = '';
 $delim = '';
 foreach ($cookies as $k => $v){
   $cookie .= "$delim$k$v";
   $delim = '; ';
 }
curl_setopt($ch, CURLOPT_COOKIE, $cookie );
获取所有饼干:

  $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;
  }
 $cookie = '';
 $show = '';
 $delim = '';
 foreach ($cookies as $k => $v){
   $cookie .= "$delim$k$v";
   $delim = '; ';
 }
curl_setopt($ch, CURLOPT_COOKIE, $cookie );
重建cookies:

  $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;
  }
 $cookie = '';
 $show = '';
 $delim = '';
 foreach ($cookies as $k => $v){
   $cookie .= "$delim$k$v";
   $delim = '; ';
 }
curl_setopt($ch, CURLOPT_COOKIE, $cookie );
然后使用:

  $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;
  }
 $cookie = '';
 $show = '';
 $delim = '';
 foreach ($cookies as $k => $v){
   $cookie .= "$delim$k$v";
   $delim = '; ';
 }
curl_setopt($ch, CURLOPT_COOKIE, $cookie );
许多用途:

CURLOPT_COOKIEJAR
CURLOPT_COOKIEFILE
有很多次饼干罐不工作。如果你在做一些简单的事情,它们很好用

当出现重定向或在随后的请求中需要Cookie时,Cookie Jar会崩溃


当您需要重定向页面中的其他数据时,问题尤其严重。我遇到过这样的情况:有一系列多达半打的重定向,cookies不断变化

你能告诉我这是做什么的吗?当你第一次提出请求时,这段代码将cookies保存在名为“cookies.txt”的文件中。在第二次请求期间,它还会将保存的cookie添加到头中,因此保存的cookie将被发送回服务器。我明白了,这几乎是对浏览器的模拟。那么,
CURLOPT\u COOKIE
做什么呢?@Jaylen我的数组就像这个数组([metadata]=>stdClass对象([total\u pages]=>1[total\u records]=>1[data]=>stdClass对象([token]=>xxxxxxxxxx[time]=>2017-04-11 00:12:36[user\u id]=>000000[site\u address]=>user\u-address]=>user\u-role]=>admin[access]=>member))我想将令牌id保存到cookies.txt中,我不知道如何才能做到这一点。