GuzzleHttp: как я могу сохранить файлы cookie из ответа POST и использовать их в следующем POST?

Я использую Guzzle для входа на свой сайт API, и в тот момент, когда я вхожу в систему с правильными учетными данными, я получаю файл cookie с RefreshToken, чтобы отправить его при следующем вызове, вот мой простой (и хорошо работающий) код:

$client = new Client(array(
            'cookies' => true
        ));


        $response = $client->request('POST', 'http://myapi.com/login', [
            'timeout' => 30,
            'form_params' => [
                'email' => $request->get('email'),
                'password' => $request->get('password'),
            ]
        ]);

и я получаю правильный ответ с помощью файла cookie, я могу увидеть файл cookie, используя:

$newCookies = $response->getHeader('set-cookie');

теперь мне нужно использовать этот файл cookie при следующих вызовах, и я знаю, что Guzzle может сохранить файл cookie для меня и отправить его автоматически (или нет) при следующем вызове с использованием «CookieJar» или «SessionCookieJar», я пытался использовать это, но я не вижу куки в «банке», вот что я сделал:

$cookieJar = new SessionCookieJar('SESSION_STORAGE', true);

        $client = new Client([
          'cookies' => $cookieJar
        ]);

        $response = $client->request ....

но когда я получаю файл cookie из POST, я могу увидеть его только с помощью:

$newCookies = $response->getHeader('set-cookie');

и его нет в cookieJar, поэтому он не отправит его при следующем вызове ... что мне здесь не хватает?

Благодарю вас!


person Eran Levi    schedule 31.07.2017    source источник
comment
docs.guzzlephp.org/en/stable/quickstart.html#cookies. Вам нужно установить банку для запроса на вход, чтобы он собирал куки.   -  person Phil    schedule 31.07.2017
comment
Спасибо за ваш ответ, я попытался установить его в запросе, и в новой инициализации клиента ничего не работает (я много раз читал руководство), можете ли вы добавить код?   -  person Eran Levi    schedule 31.07.2017


Ответы (1)


Согласно документации здесь, ['cookies' => true] указывает на использование общего файла cookie. jar для всех запросов, а ['cookies' => $jar] указывает на использование конкретного файла cookie ($jar) для запросов/ответов клиента. Таким образом, вам нужно будет использовать либо:

$client = new Client(array(
    'cookies' => true
));


$response = $client->request('POST', 'http://myapi.com/login', [
    'timeout' => 30,
    'form_params' => [
        'email' => $request->get('email'),
        'password' => $request->get('password'),
    ]
]);

// and using the same client

$response = $client->request('GET', 'http://myapi.com/next-url');

// or elsewhere ...

$client = new Client(array(
    'cookies' => true
));

$response = $client->request('GET', 'http://myapi.com/next-url');

or

$jar = new CookieJar;

$client = new Client(array(
    'cookies' => $jar
));


$response = $client->request('POST', 'http://myapi.com/login', [
    'timeout' => 30,
    'form_params' => [
        'email' => $request->get('email'),
        'password' => $request->get('password'),
    ]
]);

// and using the same client

$response = $client->request('GET', 'http://myapi.com/next-url');

// or elsewhere ...

$client = new Client(array(
    'cookies' => $jar // the same $jar as above
));

$response = $client->request('GET', 'http://myapi.com/another-url');
person Francis Eytan Dortort    schedule 07.09.2017