きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

C# × Microsoft.AspNet.WebApi.Client × 使い方をまとめてみた

この記事の目的

この記事では、
Web API Client Libraryを使ったWeb API呼び出し処理の実装手順をまとめること
を目的としています。

本題

★はじめに(関連ドキュメント紹介)

公式ドキュメントは以下のURLです。
基本的に公式ドキュメントに記載されていることをベースにまとめていきます。
.NET クライアント (c#) から Web API を呼び出す | Microsoft Docs

今回利用するWeb API Client Libraryは、

  1. System.Net.Http.HttpClient
  2. Json.NET(OSS

を利用しています。

参考までに以前このブログでSystem.Net.Http.HttpClientについて触れた記事へのリンクを残しておきます。
kinakomotitti.hatenablog.com

★インストール方法

公式ドキュメントには、以下のNugetコマンドを実行しますとあります。

Install-Package Microsoft.AspNet.WebApi.Client

コマンドは簡単ですが、いつもやっているNuget Packageマネージャーを使ってライブラリをインストールしてみます。
検索してみた結果が以下の画面です。
f:id:kinakomotitti:20180418230600p:plain
図の上の赤枠で示していますが、正確には、Microsoft.AspNet.WebApi.Clientという名前の様です。
図の下の赤枠で示しているように、Newtonsoft.Json(Json.NET)と、Microsoft.Net.Httpに依存関係があるのが確認できます。

ここまで来たら「インストール」ボタンを押下することでインストールが完了します。
途中、以下のような画面が出てきたら迷わず「同意する」を押下してください。
同意しないと使えません。
f:id:kinakomotitti:20180418230611p:plain

★どう変わるか確認してみる

今回は特にPOST処理を実行したいので、POSTについて注目していきます。
HttpClientでは、POSTに関するメソッドとして以下のものが用意されています。
f:id:kinakomotitti:20180418230626p:plain

次に、追加された拡張メソッドを下に示します。
f:id:kinakomotitti:20180418230635p:plain

おもったより多くてびっくりしました。
細かくて見えないかもしれませんが、一応張っておきます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; }
        }
    }

まとめ

初めは、HttpContentの使い方を調べていたのですが、ふと見つけたライブラリでとても簡単に実装することができました。
Web APIのクライアントを実装するときには、「Web API Client Library」必須ですねw