🌟

Power Apps + ASP.NET Core 6.0

2021/10/17に公開

以前、Azure Functions で Open API の定義を作って Power Apps から呼ぶということをやりました。

https://zenn.dev/okazuki/articles/azure-function-powerapps

自分が Azure Functions を好んで使う理由として Web API を作るのにコード量が一番少ない!!というのがあります。でも .NET 6 になると ASP.NET Core 側も Minimal APIs というのが追加されていて、簡単な Web API の定義は簡単に出来るようになりました。

多分、まだドキュメントは完成して無さそうなんですけどブログで言及されていたり、以下のようにドキュメントの元ネタが github で作られているのが確認できます。

https://github.com/dotnet/AspNetCore.Docs/blob/525b23a69e9903b39e40b8cd17a69579d50fb885/aspnetcore/tutorials/min-web-api.md

Visual Studio 2022 を使うとプロジェクトテンプレートに ASP.NET Core (空) というものが追加されています。

このテンプレートでプロジェクトを作成すると Program.cs の中身が以下のような 10 行以下のプロジェクトが作られます。

Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

これだけで、なんとアクセスすると Hello world を返す Web API が作られてるあたり本当に Minimal!!!! って感じですね。

Power Apps から呼べるようにしてみよう

Power Apps というか Power Platform のカスタムコネクターに登録するには Open API の定義が必要なので、これに対応していきます。Open API 定義を生成してもらうには Swashbuckle.AspNetCore というパッケージを追加する必要があるので NuGet から追加します。現時点の最新の 6.2.3 を入れました。

そして、以下のコードを追加します。追加ぶんはたったの 3 行ですね。
Open API の定義を生成するために ApiExplorer というものに依存しているみたいなので最初に、その機能を有効にしています。その後 AddSwaggerGen を呼び出します。app.UseSwagger(...) で今回は Open API の v2 の定義を生成するように設定を変えています。確か Power Platform が v2 をご所望だったので。

Program.cs
var builder = WebApplication.CreateBuilder(args);
// 以下の2行を追加
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();

// 以下の1行を追加。今回は Power Platform のカスタムコネクタに登録するので Open API v2 にしました
app.UseSwagger(options => options.SerializeAsV2 = true);

app.MapGet("/", () => "Hello World!");

app.Run();

この状態で実行して https://localhost:XXXX/swagger/v1/swagger.json という URL にアクセスすると以下のように Open API の定義が生成されます!いいね。

もう 1 つ、Power Platform からいい感じに呼び出せるように手を加えます。手を加えるといっても戻り値を JSON にする必要があるだけなので文字列をダイレクトに返しているものを匿名型に変更するようにしました。戻り値がオブジェクトだと勝手に JSON にしてくれるらしいので楽でいいですね。あとは属性をつけて名前をつけておきました。これがないと Power Platform のカスタムコネクタに取り込んだときに名前が無いと怒られてしまいます。ついでにパラメーターも受け取るようにしました。

Program.cs
var builder = WebApplication.CreateBuilder(args);
// 以下の2行を追加
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();

// 以下の1行を追加。今回は Power Platform のカスタムコネクタに登録するので Open API v2 にしました
app.UseSwagger(options => options.SerializeAsV2 = true);

app.MapGet("/", 
    // Open API の定義に名前をつける
    [EndpointName("Greet")]
    // パラメーターを追加、あとは戻り値が json になるようにオブジェクトを返す
    (string name) => new { Message = $"こんにちは {name} さん!" });

app.Run();

では実行して swagger.json を表示してみましょう。

swagger.json
{
  "swagger": "2.0",
  "info": {
    "title": "WebApplication9",
    "version": "1.0"
  },
  "paths": {
    "/": {
      "get": {
        "tags": [
          "WebApplication9"
        ],
        "operationId": "Greet",
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "query",
            "name": "name",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "schema": {
              "$ref": "#/definitions/String<>f__AnonymousType0"
            }
          }
        }
      }
    }
  },
  "definitions": {
    "String<>f__AnonymousType0": {
      "type": "object",
      "properties": {
        "message": {
          "type": "string"
        }
      }
    }
  }
}

ちゃんと response が application/json になっていますね。operationId も、ちゃんと Greet になっています。良さそうなのでローカルに保存しておきます。

name パラメーターもつけて呼び出して動作確認もしました。良さそうですね。

インターネットに放流しよう

Power Apps から呼び出せるようにするためにクラウド上にデプロイしましょう。.NET 6 の正式リリースは 11 月なので現状 Azure の Web Apps ではプレビューでサポートになっています。Web Apps 作るタイミングで .NET 6 (プレビュー) を選択することで .NET 6 で作ったものがさくっとデプロイできます。

多分 11 月に .NET 6 がリリースされたらすぐに Azure 上でも正式に対応されると思います。さくっとデプロイして URL だけは控えておきます。因みにデプロイ時に以下のようなメッセージが出ますが大丈夫なのでそのままデプロイしましょう。正式リリース後はサクッと行く感じになります。

カスタムコネクタを作ろう

ここら辺は Azure Functions の時と同じです。なので前の記事や、そこからいける動画を見てみてください。今回は認証がなにもないのでコネクタ作って接続もさくっと作って終わりです。

使ってみよう

では、使いましょう。適当なアプリを Power Apps で作って以下のように追加したカスタムコネクタをアプリのデータ ソースに追加しましょう。

ボタンや InputText を置いてボタンの OnSelect で先ほど追加したカスタムコネクタ(ここでは WebApplication9 という名前で追加されています) の処理を呼び出します。

UpdateContext({ greetResult: WebApplication9.Greet(TextInput1.Text)});

greetResult に結果が入ってるので、適当なラベルの Text プロパティに greetRetuls.message を設定します。

実行して動作確認

では動かします。テキストボックスに適当に名前を入れて送信ボタンを押すとメッセージが表示されます。ちゃんと自分で作った Web API が呼ばれますね!

まとめ

ということで、前に Azure Functions でやったようなことを ASP.NET Core の Minimal APIs でやってみました。こんな風に Open API さえ生成できるものであれば簡単に繋げることが出来るのでいいですね!

.NET 6 がリリースされたら ASP.NET Core Minimal APIs がもしかしたらコード量最小でいけるかもしれないので、ちょっと使ってみようかなと思います。まぁちょっと API 数が増えてきたら普通に Controller とか定義してやると思います。

Microsoft (有志)

Discussion