Я пытаюсь связаться с 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);
Но тоже не сработало
$cookiesFile = 'cookies.txt';
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiesFile); // write
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiesFile); // read
Часто файлы 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 крошится.
Особенно проблематично, когда вам нужны другие данные с перенаправленной страницы. Я столкнулся с случаем, когда есть серия с полдюжины перенаправлений, и куки постоянно меняются.