GuzzleHttp:如何保存来自POST响应的cookie并在下一个POST中使用?

13

我正在使用Guzzle登录我的API网站,当我使用正确的凭据登录时,会收到一个包含RefreshToken的cookie,以在下一次调用中发送它。这是我的简单(而且工作良好)的代码:

$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”在下一次调用中自动(或不自动)发送它。我已经尝试使用它,但是我没有在‘jar’中看到cookie,这里是我所做的:

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

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

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

但是,当我从POST请求中获取到cookie时,我只能通过以下方式看到它:

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

它不在cookieJar中,所以它不会在下一次调用中发送。我在这里错过了什么?

谢谢!


你需要为登录请求设置cookie jar,以便它可以收集cookie。请参考:http://docs.guzzlephp.org/en/stable/quickstart.html#cookies。 - Phil
感谢您的回答,我尝试在请求中设置它和在新客户端初始化中设置它,但都不起作用(我已经多次阅读了手册),您能否添加一些代码? - Eran Levi
2个回答

26
根据这里的文档['cookies' => true]表示对于所有请求使用共享cookie存储器,而['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');
或者
$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');

1
//post form params
$response = $client->post(route('login'), [
    'form_params' => [
        'login' => 'login',
        'password' => 'password',
    ],
    'headers' => [
        'Accept' => 'text/html,application/xhtml+xm…ml;q=0.9,image/webp,*/*;q=0.8',
        'Content-Type' => 'application/x-www-form-urlencoded',
        'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'
    ]
]);

//get cookie from header in response
$cookie = $response->getHeaderLine('Set-Cookie');

//get page with cookie
$client->get('/products', [
    'headers' => [
        'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
        'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'accept-encoding' => 'gzip, deflate, br',
        'accept-language' => 'ru',
        'cookie' => $cookie, //this cookie data
    ],
    'debug' => false
]);

嗨,谢谢你的回答。如果您能解释一下您的代码是做什么的,那就太好了。这样可以更有助于社区从您身上学习! - Simas Joneliunas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接