HttpClientのBaseAddressを使う方法

投稿者: | 7月 21, 2015

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」にいろんなパターンを当てはめて動作を調べてみました。

image

「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などのメソッドでは、スラッシュではじめない

ことが重要であることがわかりました。

カテゴリー: C#

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください