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

ナビゲーションに移動 検索に移動
編集の要約なし
206行目: 206行目:


     return resBodyStr;
     return resBodyStr;
}
</syntaxhighlight>
<br>
==== POST ====
以下の例では、リクエストのボディにJSON形式の内容を送受信している。<br>
JSONは、JS、Ruby、Python、PHP等では連想配列を使用して簡単に作成できるが、C#においては<code>Dictionary</code>型を使用および変換後、<code>StringContent</code>型に情報を付加してリクエストに格納する。<br>
<br>
APIの認証方式において、事前に与えられているAPIキーや他の認証情報の文字列を送信する時、認証が成功した場合はアクセストークンを返却して、以降はそのアクセストークンをリクエストヘッダに追加してAPIを呼ぶ場合がある。<br>
その場合は、以下の例と同様の処理となる。<br>
<br>
リクエストのボディにおいて、引数に指定の形式でAPIキー等を格納してPOSTで送信する時、レスポンスのボディの一部にトークンが入って返される。<br>
サンプルコードの内部メソッド AddHeaders() は固定のヘッダー追加しか行っていませんが、ここにトークンがあれば追加するような処理を加えると使い回せます。
<syntaxhighlight lang="c#">
// ボディに文字列のキーをJSONで持ってPOSTを送受信する
public string Post(string someKey)
{
    String requestEndPoint = this.baseUrl + "some/post";
    var request = this.CreateRequest(HttpMethod.Post, requestEndPoint);
    var jsonDict = new Dictionary<string, string>() {
                      {"someKey", someKey},
                  };
    var reqBodyJson = JsonSerializer.Serialize(jsonDict, this.GetJsonOption());
    var content = new StringContent(reqBodyJson, Encoding.UTF8, @"application/json");
    request.Content = content;
    string resBodyStr;
    var resStatusCoode = HttpStatusCode.NotFound;
    Task<HttpResponseMessage> response;
    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;
}
// HTTPリクエストメッセージを生成する
// httpMethod : HTTPメソッドのオブジェクト
// requestEndPoint : 通信先のURL
private HttpRequestMessage CreateRequest(HttpMethod httpMethod, string requestEndPoint)
{
    var request = new HttpRequestMessage(httpMethod, requestEndPoint);
    return this.AddHeaders(request);
}
// HTTPリクエストにヘッダーを追加する
// request : リクエスト
private HttpRequestMessage AddHeaders(HttpRequestMessage request)
{
    request.Headers.Add("Accept", "application/json");
    request.Headers.Add("Accept-Charset", "utf-8");
    // 例えば、認証通過後のトークンが "Authorization: Bearer {トークンの文字列}" のように必要な場合は追加する
    return request;
}
</syntaxhighlight>
<br>
==== DELETE ====
<code>GET</code>と同様、HTTPメソッドの<code>DELETE</code>を指定して<code>HttpRequestMessage</code>クラスのインスタンスを生成して渡す。<br>
<br>
JSからの通信では、あまり使用しない。<br>
<syntaxhighlight lang="c#">
// URLに情報を付加してDELETEを送受信する
public bool Delete(string someId)
{
    String requestEndPoint = this.baseUrl + "some/" + someId;
    var request = this.CreateRequest(HttpMethod.Delete, requestEndPoint);
    var resStatusCoode = HttpStatusCode.NotFound;
    Task<HttpResponseMessage> response;
    String resBodyStr;
    try
    {
      response = httpClient.SendAsync(request);
      resBodyStr = response.Result.Content.ReadAsStringAsync().Result;
      resStatusCoode = response.Result.StatusCode;
    }
    catch (HttpRequestException e)
    {  // 通信が失敗した場合
      return false;
    }
    if (!resStatusCoode.Equals(HttpStatusCode.OK))
    {  // レスポンスが200以外の場合
      return false;
    }
    if (String.IsNullOrEmpty(resBodyStr))
    {  // レスポンスのボディが空の場合
      return false;
    }
    return true;
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>

案内メニュー