Обработка куки-файлов Guzzle

Я создаю клиентское приложение на основе Guzzle. Я застрял с обработкой файлов cookie. Я пытаюсь реализовать это с помощью плагина cookie, но не могу заставить его работать . Мое клиентское приложение является стандартным веб-приложением, и похоже, что оно работает, пока я использую один и тот же объект guzzle, но по запросам оно не отправляет правильные файлы cookie. Я использую FileCookieJar для хранения файлов cookie. Как я могу хранить файлы cookie для нескольких объектов guzzle?

// first request with login works fine
$cookiePlugin = new CookiePlugin(new FileCookieJar('/tmp/cookie-file'));
$client->addSubscriber($cookiePlugin);

$client->post('/login');

$client->get('/test/123.php?a=b');


// second request where I expect it working, but it's not...
$cookiePlugin = new CookiePlugin(new FileCookieJar('/tmp/cookie-file'));
$client->addSubscriber($cookiePlugin);

$client->get('/another-test/456');

person Peter Krejci    schedule 05.04.2013    source источник


Ответы (2)


Вы создаете новый экземпляр CookiePlugin по второму запросу, вы также должны использовать первый экземпляр во втором (и последующем) запросе.

$cookiePlugin = new CookiePlugin(new FileCookieJar('/tmp/cookie-file'));

//First Request
$client = new Guzzle\Http\Client();
$client->addSubscriber($cookiePlugin);
$client->post('/login');
$client->get('/test/first');

//Second Request, same client
// No need for $cookiePlugin = new CookiePlugin(...
$client->get('/test/second');

//Third Request, new client, same cookies
$client2 = new Guzzle\Http\Client();
$client2->addSubscriber($cookiePlugin); //uses same instance
$client2->get('/test/third');
person xmarcos    schedule 09.09.2013

Текущие ответы будут работать, если все запросы выполняются в одном запросе пользователя. Но это не сработает, если пользователь сначала войдет в систему, затем перейдет по сайту и позже снова запросит «Домен».

Вот мое решение (с ArrayCookieJar()):

Войти

$cookiePlugin = new CookiePlugin(new ArrayCookieJar());

//First Request
$client = new Client($domain);
$client->addSubscriber($cookiePlugin);
$request = $client->post('/login');
$response = $request->send();

// Retrieve the cookie to save it somehow
$cookiesArray = $cookiePlugin->getCookieJar()->all($domain);
$cookie = $cookiesArray[0]->toArray();

// Save in session or cache of your app.
// In example laravel:
Cache::put('cookie', $cookie, 30);

Other request

// Create a new client object
$client = new Client($domain);
// Get the previously stored cookie
// Here example for laravel
$cookie = Cache::get('cookie');
// Create the new CookiePlugin object
$cookie = new Cookie($cookie);
$cookieJar = new ArrayCookieJar();
$cookieJar->add($cookie);
$cookiePlugin = new CookiePlugin($cookieJar);
$client->addSubscriber($cookiePlugin);

// Then you can do other query with these cookie
$request = $client->get('/getData');
$response = $request->send();

person Snook    schedule 09.09.2014