「C Sharpとネットワーク - HttpClient」の版間の差分

ナビゲーションに移動 検索に移動
編集の要約なし
編集の要約なし
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><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>


案内メニュー