HttpClientのBaseAddressを使うときの注意まとめ

記事作成日時: 2020/06/27 13:30

最終更新日時: 2020/06/27 14:45


はじめに

HttpClientでhttp://example.com/base/test/apiにリクエストしたいとします。 HttpClientは以下のようにBaseAddressで初期化し、GetAsyncを使ってリクエストを実行します。

var client = new HttpClient
{
    BaseAddress = new Uri("<ベースとなるURI>")
};

var res = await client.GetAsync("<アクセスしたいパス>");

設定する値によってリクエストするURIが代わる

BaseAddress, GetAsyncそれぞれに設定する値によって、リクエストするURIが変わります。

BaseAddressの値 GetAsyncの引数 生成されるURI
http://example.com base/test/api http://example.com/base/test/api
http://example.com /base/test/api http://example.com/base/test/api
http://example.com http://example.com/base/test/api http://example.com/base/test/api
http://example.com/ base/test/api http://example.com/base/test/api
http://example.com/ /base/test/api http://example.com/base/test/api
http://example.com/ http://example.com/base/test/api http://example.com/base/test/api
http://example.com/base/ test/api http://example.com/base/test/api
http://example.com/base/ /test/api http://example.com/test/api
http://example.com/base/ http://example.com/base/test/api http://example.com/base/test/api
http://example.com/base test/api http://example.com/test/api
http://example.com/base /test/api http://example.com/test/api
http://example.com/base http://example.com/base/test/api http://example.com/base/test/api

BaseAddressにパスを含めない場合は期待通りになる

BaseAddresshttp://example.comもしくはhttp://example.com/の場合は、GetAsyncにどのような引数を渡してもリクエストするURIは期待通りです。

パスを含める場合、最後の/の有無でリクエストURIが変化する

BaseAddressにパスを含むURIを設定すると、最後に/があるかないかで結果が変わります。
意図しないURIになってしまう可能性があるということです。

結論

1. BaseAddressにパスを含ませない

パスを含ませると、意図しないリクエストURIになる可能性があります。
基本的にパスを含ませないようにしましょう。

2. BaseAddressにパスを含ませる場合は/に気をつける

BaseAddressにパスを含む場合は最後に/を入れましょう。
GetAsyncの引数にも注意しましょう。先頭の/の有無で生成されるURIは変化します。

つまり、パスを含ませる場合は以下の2点を守りましょう。

  1. BaseAddressは必ず最後は/で終わる
  2. GetAsyncの引数の先頭は/をつけない