【PHP】GuzzleでPOSTリクエストができなかったお話し

Guzzleとは・・・?

PHPでHTTPのリクエストを送ったりしたい場合に使えるやつ!ですw

詳しくは以下をみてください!

でそれを使ってPOSTリクエストを送ろうとした時に遭遇したことについてお話ししようかなと。

GuzzleでPOSTリクエストを送る

さて、まずはもともとやりたかったことがPOSTリクエストを送ることです。

Guzzleを使うことでPOSTを送ることができます。

大体以下のような感じで送れます。

        $client = new Client(['base_uri' => 'localhost:8000']);
        $options = [
            'http_errors' => false,
            'json' => [
                'text' => 'hoge'
            ]
        ];
        $response = $client->request('POST', '', $options);
        $responseBody = $response->getBody()->getContents();
        return $responseBody;

すごい雑ではありますが、上記のようにすれば基本的なPOSTリクエストの送信は可能なはずです。

(ポート番号'8000'とかは人によって変わります)

最初にクライアントを作成し、$oprionsに送りたいオプション(付加情報)を代入し、リクエストを送信する時に送っています。

$client->request('POST', '', $options);

の第二引数はURIの続きなんですが、今回は使わないので空文字を送っています。

もし、何かしらのuriが入っていたら、最初のclientの作成時に作ったbase_urlの後ろにそのuriを付けたuriに対してポストリクエストが送られます。

例えば、base_urlに"localhost:8000", requestの第二引数に"/hoge"となっていたら、POSTされるURIは"localhost:8000/hoge"になる、といった具合ですね。

今回は"localhost:8000"だけにしています。

さて、これで動くはずだったんです...

ところが、上記ではうまくいきませんでした...orz

原因

さて、原因は至極単純なことでした...

実は僕が本来ポストを送りたい先のサービスはMacのホスト上で動かしていたんですが、このプログラムを書いているサービスはdockerで動かしていました。

問題としては'localhost'の箇所で、ホスト上ではそのホストのlocal、docker上ではdockerのlocalで、入り口がそれぞれ違うんです。

つまり、ポストを送られる側はホストのlocalで受信しようとし、ホストを送る側はdockerのlocalに送信しようとしていたわけです。

そのせいで、dockerのlocalへのアクセスはできないよー!っと怒られてしまっていました...orz

これを直すためには、dockerから送信する場合に、dockerのlocalじゃなくて、ホストのlocalに送信するよー!

って教えてあげる必要があるんですね!

以下の"I WANT TO CONNECT FROM A CONTAINER TO A SERVICE ON THE HOST"によると、ただの"localhost"の代わりに、"host.docker.internal"としてあげれば良さそうです。

   $client = new Client(['host.docker.internal:8000']); // <- ここだけ修正
        $options = [
            'http_errors' => false,
            'json' => [
                'text' => 'hoge'
            ]
        ];
        $response = $client->request('POST', '', $options);
        $responseBody = $response->getBody()->getContents();
        return $responseBody;

こうすることでちゃんとリクエストが送信されました!

まとめ

dockerについてはまだまだ知らない部分も多いからそのうちしっかり勉強したいですね...

とりあえず環境構築のリファレンスだけみて動くようにしているだけなので...w

今回の件もあまり詳しく調べきれていないのですが、おそらくDocker Desktop for Macではこうなってしまう感じなのかな?と思います。

別のものだと少し違った挙動になってくるのかな...?

気にはなりますが、また時間のある時にでも....w

それでわ!

おすすめの記事