2013-04-05 5 views
4

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

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

ответ

3
$cookiePlugin = new CookiePlugin(new FileCookieJar($cookie_file_name)); 

// Add the cookie plugin to a client 
$client = new Client($domain); 
$client->addSubscriber($cookiePlugin); 

// Send the request with no cookies and parse the returned cookies 
$client->get($domain)->send(); 

// Send the request again, noticing that cookies are being sent 
$request = $client->get($domain); 
$request->send(); 

print_r ($request->getCookies()); 
5

Вы создаете новый экземпляр 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'); 
3

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

Вот мое решение (с 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); 

Другой запрос

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