Не удается отправить куки с запросом жрать
У меня есть PHP-скрипт, который должен получить CSV-файл из приложения. Существует API для приложения, которое позволяет скрипту входить в систему, что дает скрипту сеансовый файл cookie для аутентификации. Затем мне нужно сделать запрос doa GET, чтобы получить CSV-файл (который API не поддерживает).
Использование каталога curl работает:
$c = curl_init($url);
curl_setopt($c, CURLOPT_COOKIE, 'PHPSESSID=' . $session_id_from_api);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$csv_file = curl_exec($c);
echo $csv_file;
, который извлекает CSV-файл, используя идентификатор сеанса, полученный из логина API и переданный через coookie.
Теперь я хотел бы сделать следующее: то же самое с помощью Guzzle, но вместо этого я просто получаю страницу входа. Вот код, который я использую:
$client = new GuzzleHttpClient();
$request = $client->get(
$url,
[
'cookies' => ['PHPSESSID' => $session_id_from_api],
]
);
$response = $client->send($request);
echo $response->getBody(true);
Это дает мне страницу входа в систему, поэтому GET to the application не распознает сеанс, определенный файлом cookie.
Есть ли что-нибудь еще, что мне нужно сделать, чтобы обеспечить отправку файла cookie и указанного значения в удаленное приложение?
Edit: глядя на $request->getRawHeaders()
, я вижу эту строку в заголовках:
cookies: vec6nb1egvvui6op7qr7b0oqf6
Это, очевидно, неправильно. Документация для моей версии жратва приводит такой пример:
// Enable cookies and send specific cookies
$client->get('/get', ['cookies' => ['foo' => 'bar']]);
Что, как мне кажется, согласуется с тем, что я передаю на съедение.
Просто для ясности, я не пытаюсь управлять файлами cookie в обоих направлениях по нескольким запросам, поэтому нет необходимости хранить какие-либо файлы cookie. У меня есть имя файла cookie и его значение (из другого источника), и я просто хочу убедиться, что это имя и значение отправляются в пункт назначения для одного запроса GET. Я не пытаюсь "поддерживать сеанс", но в некотором смысле у меня есть сессия перешла ко мне из другой части приложения (не жрать) и нужно настроить мой запрос жрать, чтобы использовать его.1 ответ:
Ну, это, кажется, работает. Guzzle не отправлял куки, не будучи уверенным, что домен, на который он его отправлял, был правильным:
// Set up a cookie - name, value AND domain. $cookie = new Guzzle\Plugin\Cookie\Cookie(); $cookie->setName('PHPSESSID'); $cookie->setValue($session_id_from_api); $cookie->setDomain($domain_of_my_service_url); // Set up a cookie jar and add the cookie to it. $jar = new Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar(); $jar->add($cookie); // Set up the cookie plugin, giving it the cookie jar. $plugin = new Guzzle\Plugin\Cookie\CookiePlugin($jar); // Register the plugin with the client. $client->addSubscriber($plugin); // Now do the request as normal. $request = $client->get($url); $response = $client->send($request); // The returned page body. echo $response->getBody(true);