rksoftware

Visual Studio とか C# とかが好きです

AutoRest で生成したクライアントコードを使う

ASP.NET Core WebAPI を Swashbuckle でドキュメント作って AutoRest でクライアントを生成してみた記事の続編です。

■ 生成されたクライアントコード

生成されたクライアントコードは .cs ファイルだけです。分かりやすく言うと、.csproj 等のファイルは作られないのでこのままではビルドできません。実際生成されたコードをどういったアプリで使うかは分からないので、これは妥当な仕様でしょう。
しかし、コードを動かすためにひと手間かかるので、ひとまず動作させるまでの流れをメモしておきます。

クライアントコードを実行する最小のアプリとして、今回はコンソールアプリを作っていきます。

■ プロジェクトの新規作成

.NET Core のコンソールアプリプロジェクトを新規に作成します。.NET Core はコンソールからプロジェクトを新規に作成できるので楽でいいですよね。

生成されたクライアントコードのあるディレクトリへ

生成されたクライアントコードのあるディレクトリへ移動します。次のファイルのあるディレクトリです。

  • IMyAPI.cs
  • MyAPI.cs
  • MyAPIExtensions.cs

プロジェクトの新規作成

ディレクトリへ移動したらコマンドを実行します。

dotnet new console

これでプロジェクトが生成されるので、Visual Studio などでプロジェクトを開きます。
.NET Core プロジェクトを作った際は、そのディレクトリ内のファイルはプロジェクト構成として含まれる形式になっているので、前述の IMyAPI.cs、MyAPI.cs、MyAPIExtensions.cs もプロジェクトに含まれて見えているはずです。

■ NuGet パッケージのインストール

生成されたクライアントコードはいくつかのパッケージに依存するコードになっているので、インストールします。インストールすべきパッケージはビルドエラーからわかります。

名前空間 Microsoft.Rest が見つからないエラー

Microsoft.Rest.ClientRuntime をインストールします。

名前空間 Newtonsoft が見つからないエラー

Newtonsoft.Json をインストールします。

■ Program.cs

実際にクライアントコードを使うコードを Program.cs に書きます。
書いたコードがこちらです。

using swagger;
using System;
using System.Text.Json;
using System.Threading.Tasks;

namespace CSharp_Swagger
{
    class Program
    {
        static async Task Main(string[] args)
        {
            IMyAPI myAPI = new MyAPI(new Uri("http://localhost:5000/"));
            var weathers = await myAPI.GetWeatherForecastAsync();
            var json = JsonSerializer.Serialize(weathers);
            Console.WriteLine(json);
            Console.ReadKey();
        }
    }
}

Main メソッド一行目で型推論を使っていないのは、生成されたコードでインタフェースも生まれていたので明示的に使って見たからです。
実際には型推論でも良いでしょうし、DI もするでしょう。

■ 実行

実行してみると、WebAPI が提供する天気の情報が取れます。今回は JSON 文字列にして Console.WriteLine しています。

[{"Date":"2019-12-23T11:53:50.7695024Z","TemperatureC":47,"TemperatureF":116,"Summary":"Mild"},{"Date":"2019-12-24T11:53:50.769529Z","TemperatureC":23,"TemperatureF":73,"Summary":"Warm"},{"Date":"2019-12-25T11:53:50.7695295Z","TemperatureC":51,"TemperatureF":123,"Summary":"Sweltering"},{"Date":"2019-12-26T11:53:50.7695298Z","TemperatureC":49,"TemperatureF":120,"Summary":"Scorching"},{"Date":"2019-12-27T11:53:50.76953Z","TemperatureC":16,"TemperatureF":60,"Summary":"Cool"}]

フォーマットしてみると次のようになります。フォーマットは VSCode で行いました。見やすいですね。

[
    {
        "Date": "2019-12-23T11:53:50.7695024Z",
        "TemperatureC": 47,
        "TemperatureF": 116,
        "Summary": "Mild"
    },
    {
        "Date": "2019-12-24T11:53:50.769529Z",
        "TemperatureC": 23,
        "TemperatureF": 73,
        "Summary": "Warm"
    },
    {
        "Date": "2019-12-25T11:53:50.7695295Z",
        "TemperatureC": 51,
        "TemperatureF": 123,
        "Summary": "Sweltering"
    },
    {
        "Date": "2019-12-26T11:53:50.7695298Z",
        "TemperatureC": 49,
        "TemperatureF": 120,
        "Summary": "Scorching"
    },
    {
        "Date": "2019-12-27T11:53:50.76953Z",
        "TemperatureC": 16,
        "TemperatureF": 60,
        "Summary": "Cool"
    }
]

■ 今回のコード

今回のコードは GitHub にも置いておきました。