web-dev-qa-db-ja.com

GuzzleHttp:POST応答からCookieを保存し、次のPOSTで使用するにはどうすればよいですか?

私は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を取り戻すと、次を使用することによってのみCookieを表示できます。

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

cookieJarにはないので、次の呼び出しでは送信されません。ここで何が欠けていますか?

ありがとうございました!

9
Eran Levi

ドキュメントによると ここ['cookies' => true]は、すべてのリクエストに共有Cookie jarを使用することを示し、['cookies' => $jar]特定のクッキージャーの使用を示しました($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');
10