Featured image of post Guzzleでbase_uri指定したときに遭遇したトラブル

Guzzleでbase_uri指定したときに遭遇したトラブル

Twitter ツイート Hatena Bookmark ブックマーク

GuzzleはPHPでよく使われるHTTPクライアントの一つです。
しかし、Guzzleを使う際に base_uri に関連するトラブルに頻繁に遭遇することがあります。この問題を解決するために、base_uriの使い方と、その際に注意すべき点をこの記事でまとめます。

base_uriの使い方

Guzzleのクライアント生成時に base_uri を指定することができます。

1
2
3
4
5
use GuzzleHttp\Client;

$client = new Client([
  'base_uri' => 'https://polidog.jp'
])

base_uriにpathも含めてリクエストしたらpathの部分が反映されなかった

1
2
3
4
5
6
7
use GuzzleHttp\Client;

$client = new Client([
  'base_uri' => 'https://polidog.jp/a/b'
])

$client->get('/c')

このように指定した場合、 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 と変更します。

1
2
3
4
5
6
7
use GuzzleHttp\Client;

$client = new Client([
  'base_uri' => 'https://polidog.jp/a/b'
])

$client->get('c')

この場合、送信されたリクエストは https://polidog.jp/a/c となりました。
これは、base_uri にパスを指定する際に末尾に / を付けていないことが原因です。
UriResolver.php#L85-L90 では、base_uri の末尾に / がないと最後の / より前までがパスとして扱われるため、このような挙動になります。

まとめ

  • base_uri にパスを含める場合、リクエスト時のパスには先頭に / を付けないようにしましょう。/ が付くと、base_uri のパスが無視されます。
  • base_uri にパスを含める場合、末尾に / を付けることで意図した動作をさせることができます。
comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。