本題
★はじめに(関連ドキュメント紹介)
公式ドキュメントは以下のURLです。
基本的に公式ドキュメントに記載されていることをベースにまとめていきます。
.NET クライアント (c#) から Web API を呼び出す | Microsoft Docs
今回利用するWeb API Client Libraryは、
を利用しています。
参考までに以前このブログでSystem.Net.Http.HttpClientについて触れた記事へのリンクを残しておきます。
kinakomotitti.hatenablog.com
★インストール方法
公式ドキュメントには、以下のNugetコマンドを実行しますとあります。
Install-Package Microsoft.AspNet.WebApi.Client
コマンドは簡単ですが、いつもやっているNuget Packageマネージャーを使ってライブラリをインストールしてみます。
検索してみた結果が以下の画面です。
図の上の赤枠で示していますが、正確には、Microsoft.AspNet.WebApi.Clientという名前の様です。
図の下の赤枠で示しているように、Newtonsoft.Json(Json.NET)と、Microsoft.Net.Httpに依存関係があるのが確認できます。
ここまで来たら「インストール」ボタンを押下することでインストールが完了します。
途中、以下のような画面が出てきたら迷わず「同意する」を押下してください。
同意しないと使えません。
★どう変わるか確認してみる
今回は特にPOST処理を実行したいので、POSTについて注目していきます。
HttpClientでは、POSTに関するメソッドとして以下のものが用意されています。
次に、追加された拡張メソッドを下に示します。
おもったより多くてびっくりしました。
細かくて見えないかもしれませんが、一応張っておきますw
これらの拡張メソッドによって、Jsonに変換したり、XMLに変換したりする処理の実装が不要になります。
とても便利なライブラリです。
今回は、JsonをりようしたPOSTリクエストを実装したいので、PostAsJsonAsyncメソッドを利用していきます。
★実装サンプルを見てみる
汎用的なメソッドになるように作ってみました。
public static class HttpClientManager { private static HttpClient Client = new HttpClient(); /// <summary> /// 認証ありのWeb APIを利用する時に利用するパラメータです。 /// </summary> public static string BearerValue { get; set; } = string.Empty; public static async Task<T> ExecutePostAsync<T>(string url, T contents) { //各種設定を行います。 HttpClientManager.Client.DefaultRequestHeaders.Accept.Clear(); HttpClientManager.Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpClientManager.Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", HttpClientManager.BearerValue); //指定されたContentsを指定されたURLにPOSTします。 var response = await <b>HttpClientManager.Client.PostAsJsonAsync</b><T>(url, contents); //レスポンスのContentsをJson形式から指定されたT型のObjectのインスタンスに変換します。 return JsonConvert.DeserializeObject<T>(await response.Content.ReadAsStringAsync()); } }
とてもシンプルにまとめることができました。
PostAsJsonAsyncを利用しない場合、T型のインスタンスをJsonにシリアライズしてから、HttpContentに詰めて・・・という処理が必要となります。
それらが隠れたことでより本質的なところに目を向けることができるようになっていると思います。
※ちなみに上記クラスの利用方法は以下のようになっています。
(単体テストクラスとして作成していますがAssertは省略しています)
[TestClass] public class HttpClientManagerTest { [TestMethod] public async Task TestMethod1() { var contents = new SampleObject() { password = "password", usernameOrEmailAddress = "e-mail", tenancyName = "tenant name" }; var result = await HttpClientManager.ExecutePostAsync<SampleObject>("https://academy2016.uipath.com/api/account/authenticate",contents); } public class SampleObject { public string tenancyName { get; set; } public string usernameOrEmailAddress { get; set; } public string password { get; set; } public string result { get; set; } public object targetUrl { get; set; } public bool success { get; set; } public object error { get; set; } public bool unAuthorizedRequest { get; set; } public bool __abp { get; set; } } }