System.Net.HttpにあるHttpClientのBaseAddressの使い方がわからなかったので調べてみた。
HttpClientの使用例として、次のサンプルのようにGetAsyncなどの直接URLを記述する例をよく見ます。
using System.Net.Http; var httpClient = new HttpClient(); var response = await httpClient.GetAsync("http://requestb.in/10v5oew1");
一方で、インテリセンスを見てると、BaseAddressなんてプロパティがあります。
どうやって使い分けるのかがわからなかったので調べてみました。
using System.Net.Http; var httpClient = new HttpClient(); httpClient.BaseAddress = new Uri("http://requestb.in/10v5oew1/"); // こいつは何もの?
調べるのに使用したのは、次のコード。
var baseUri = ""; var getUri = ""; var httpClient = new HttpClient(); httpClient.BaseAddress = new Uri(baseUri); var response = await httpClient.GetAsync(getUri);
「baseUri」と「getUri」にいろんなパターンを当てはめて動作を調べてみました。
「getUri」にフルパスを指定した場合は、「baseUri」にどのようなUriを指定していも、「getUri」で指定したUriにリクエストをする。上書きをする動き。
「baseUri」が「http: //yahoo.co.jp」で、「getUri」が「http: //google.com」と、完全に異なるドメインを指定したとしても、「getUri」の指定が優先される。
「baseUri」の終わりがスラッシュ(「http: //yahoo.co.jp/foo/」)で、「getUri」の始まりがスラッシュでない文字列(「hoge/foo?bar=1」みたいなの)を指定した場合、単純に文字列結合したUrl(「http: //yahoo.co.jp/foo/hoge/foo?bar=1」)にリクエストする。
それ以外のパターンでは、「baseUri」のホストドメイン+「getUri」が結合されたUriにリクエストされる。
結論
HttpClientのBaseAddressを有効活用したいのなら、
– BaseAddressは、スラッシュで終わる
– GetAsyncなどのメソッドでは、スラッシュではじめない
ことが重要であることがわかりました。