Как разрешить cURL автоматически добавлять полученные куки в запрос?

Я пытаюсь связаться с RESP API, используя вызовы cURL через PHP.

Первый вызов 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);

Но тоже не сработало

0

Решение

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

Другие решения

Часто файлы cookie устанавливаются при перенаправлении 302. Это может быть проблематично с cURL и куки. Настолько, что я написал свои собственные процедуры печенья.

Когда происходит перенаправление, я не разрешаю cURL следовать:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

Я получаю куки от Заголовка, поэтому я должен сказать 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 );

Многие используют:

CURLOPT_COOKIEJAR
CURLOPT_COOKIEFILE

Много раз Cookie Jar не работает. Если вы делаете что-то простое, они работают нормально.

Когда происходит переадресация или вам нужны cookie-файлы в последующем запросе, когда Cookie Jar крошится.

Особенно проблематично, когда вам нужны другие данные с перенаправленной страницы. Я столкнулся с случаем, когда есть серия с полдюжины перенаправлений, и куки постоянно меняются.

0

По вопросам рекламы [email protected]