GuzzleはPHPでよく使われるHTTPクライアントの一つです。
しかし、Guzzleを使う際に base_uri
に関連するトラブルに頻繁に遭遇することがあります。この問題を解決するために、base_uri
の使い方と、その際に注意すべき点をこの記事でまとめます。
base_uriの使い方
Guzzleのクライアント生成時に base_uri
を指定することができます。
|
|
base_uriにpathも含めてリクエストしたらpathの部分が反映されなかった
|
|
このように指定した場合、 https://polidog.jp/a/b/c
としてリクエストが送信されると思っていました。
しかし実際に送信されたリクエストは https://polidog.jp/c
となってしまいました。
絶対パス指定によるbase_uriの無視
base_uri
とリクエスト時に指定したパスの結合は、GuzzleHttp\Psr7\UriResolver::resolve メソッドで行われます。
このメソッドの動作を確認すると、パスの先頭に /
が付いている場合、base_uri
のパス部分が無視されることが分かります。そのため、base_uri
で指定した /a/b
が無視され、https://polidog.jp/c
にリクエストが送信されていました。
base_uriで指定したpathの末尾に / がついていない
先ほどのコードのリクエスト時に /c
と指定したものを c
と変更します。
|
|
この場合、送信されたリクエストは https://polidog.jp/a/c
となりました。
これは、base_uri
にパスを指定する際に末尾に /
を付けていないことが原因です。
UriResolver.php#L85-L90 では、base_uri
の末尾に /
がないと最後の /
より前までがパスとして扱われるため、このような挙動になります。
まとめ
base_uri
にパスを含める場合、リクエスト時のパスには先頭に/
を付けないようにしましょう。/
が付くと、base_uri
のパスが無視されます。base_uri
にパスを含める場合、末尾に/
を付けることで意図した動作をさせることができます。