12,925
回編集
編集の要約なし |
|||
100行目: | 100行目: | ||
<br><br> | <br><br> | ||
== | == ソリューション == | ||
==== 手順 ==== | |||
<code>HttpClient</code>クラスは、<code>private</code>キーワードおよび<code>static</code>キーワードを指定したプロパティとして持つ必要がある。<br> | <code>HttpClient</code>クラスは、<code>private</code>キーワードおよび<code>static</code>キーワードを指定したプロパティとして持つ必要がある。<br> | ||
<br> | <br> | ||
Microsoftの公式ドキュメント[https://docs.microsoft.com/ja-jp/azure/architecture/antipatterns/improper-instantiation/ 不適切なインスタンス化のアンチパターン]の中でこの問題について取り上げており、<br> | Microsoftの公式ドキュメント[https://docs.microsoft.com/ja-jp/azure/architecture/antipatterns/improper-instantiation/ 不適切なインスタンス化のアンチパターン]の中でこの問題について取り上げており、<br> | ||
HttpClientを使用した実装をする時は、インスタンスを静的変数(static)にして使用するとの記載がある。<br> | HttpClientを使用した実装をする時は、インスタンスを静的変数(static)にして使用するとの記載がある。<br> | ||
<br> | |||
==== サンプルコード ==== | |||
== サンプルコード == | |||
まず、<code>HttpClient</code>クラスのオブジェクトを生成する。<br> | まず、<code>HttpClient</code>クラスのオブジェクトを生成する。<br> | ||
この時、タイムアウトの設定等はコンストラクタで行う必要がある。<br> | この時、タイムアウトの設定等はコンストラクタで行う必要がある。<br> | ||
145行目: | 145行目: | ||
また、1つの<code>HttpClient</code>クラスは1つのソケット(1つのホスト)として使用した方がよいため、<br> | また、1つの<code>HttpClient</code>クラスは1つのソケット(1つのホスト)として使用した方がよいため、<br> | ||
異なるホストにもリクエストを投げる場合は、別の<code>HttpClient</code>クラスのオブジェクトを生成する方がよい。<br> | 異なるホストにもリクエストを投げる場合は、別の<code>HttpClient</code>クラスのオブジェクトを生成する方がよい。<br> | ||
<br><br> | |||
== HTTP通信 == | |||
==== ベースとなるクラス ==== | |||
<syntaxhighlight lang="c#"> | |||
// 通信先のベースURL | |||
private readonly string baseUrl; | |||
// HTTPクライアント | |||
private readonly HttpClient httpClient; | |||
// コンストラクタ | |||
public SampleServiceHttpClient(string baseUrl) | |||
{ | |||
this.baseUrl = baseUrl; | |||
this.httpClient = new HttpClient(); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== GET ==== | |||
URLに情報を付加してGETリクエストを送受信する。<br> | |||
<br> | |||
<code>HttpClient</code>クラスの<code>SendAsync()</code>メソッドは、<code>HttpResponseMessage</code>クラスを返す。<br> | |||
レスポンスが取得できるため、ステータスコードやボディを確認および使用することができる。<br> | |||
<br> | |||
JSON以外のテキストファイルやPDFファイル等をダウンロードする場合、レスポンスのボディにファイル内容が入ることがある。<br> | |||
<syntaxhighlight lang="c#"> | |||
// URLに情報を付加してGETリクエストを送受信する | |||
public string Get(string someId) | |||
{ | |||
String requestEndPoint = this.baseUrl + "/some/search/?someId=" + someId; | |||
var request = this.CreateRequest(HttpMethod.Get, requestEndPoint); | |||
string resBodyStr; | |||
var resStatusCoode = HttpStatusCode.NotFound; | |||
Task<HttpResponseMessage> response; | |||
// 通信の実行 | |||
// 引数にrequestを使用する場合は、GetAsync()やPostAsync()ではなく、SendAsync()である | |||
try | |||
{ | |||
response = httpClient.SendAsync(request); | |||
resBodyStr = response.Result.Content.ReadAsStringAsync().Result; | |||
resStatusCoode = response.Result.StatusCode; | |||
} | |||
catch (HttpRequestException e) | |||
{ | |||
return null; | |||
} | |||
if (!resStatusCoode.Equals(HttpStatusCode.OK)) | |||
{ // レスポンスが200以外の場合 | |||
return null; | |||
} | |||
if (String.IsNullOrEmpty(resBodyStr)) | |||
{ // レスポンスのボディが空の場合 | |||
return null; | |||
} | |||
return resBodyStr; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||