Не удается отправить куки с запросом жрать


У меня есть 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 3

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);