LaravelではHTTPクライアントとしてGuzzleをラップしたクラスを提供しています。
cookieを利用した通信方法がドキュメントになかったので確認をしました。
ライブラリのバージョン
確認をしたライブラリのバージョンは下記の通り。
・laravel/framework:11.18.1
・guzzlehttp/guzzle:7.9.2
Guzzleの仕様確認
Guzzleのドキュメントを確認すると下記の記述があります。
https://docs.guzzlephp.org/en/stable/quickstart.html#cookies
You can set
cookies
totrue
in a client constructor if you would like to use a shared cookie jar for all requests.
コンストラクタでオプションを指定し、クライアントを再利用することでcookieが利用できそうです。
Laravelの実装確認
LaravelのHTTPクラス内でのクライアントの扱いについて確認します。
実装があるのはIlluminate\Http\Client\PendingRequest
です。
buildClient
でクライアントを取得しますが、メンバ変数client
にインスタンスが存在する場合は再利用されます。createClient
ではGuzzleHttp\Clientをインスタンス化する際に、cookies
をtrue
にしています。
public function buildClient()
{
return $this->client ?? $this->createClient($this->buildHandlerStack());
}
public function createClient($handlerStack)
{
return new Client([
'handler' => $handlerStack,
'cookies' => true,
]);
}
https://github.com/laravel/framework/blob/v11.18.1/src/Illuminate/Http/Client/PendingRequest.php
実装
ということで、クライアントを先に生成し、リクエストの際にsetClient
を行ったサンプルは下記のようになります。
WordPressにログインし、投稿一覧ページのHMTLを取得しています。
public function __invoke__()
{
$client = Http::buildClient();
$response = Http::setClient($client)
->asForm()
->post('https://example.jp/wp-login.php', [
'log' => 'user',
'pwd' => 'password',
]);
if (strpos($response->body(), '入力内容を確認の上、もう一度送信してください。') !== FALSE) {
return 'ログインエラー';
}
$response = Http::setClient($client)
->get('https://example.jp/wp-admin/edit.php');
if (!$response->successful()) {
return '取得エラー';
}
dd($response->body());
}
[AD]