himanago

Azure・C#などのMS系技術やLINE関連技術など、好きな技術について書くブログ

Googleアシスタント対応バックエンドを C#+Azure Functions で「簡単に」作る(ProtcolBufJsonResult不要論)

はじめに

今日もスマートスピーカースキル開発まわりの小ネタを。
今日はGoogleアシスタントでいきます。

ProtcolBufJsonResult 的なクラス

Googleアシスタント用のバックエンドを C# + Azure Functionsで作るときの話です。

Azure Functionsでバックエンドを作るのはとてもお手軽なんですが、毎回こんなクラスを用意していました(地味に面倒)。

JSONシリアライズをするための、IActionResult の実装です。

public class ProtcolBufJsonResult : IActionResult
{
    private readonly object _obj;
    private readonly JsonFormatter _formatter;

    public ProtcolBufJsonResult(object obj, JsonFormatter formatter)
    {
        _obj = obj;
        _formatter = formatter;
    }

    public async Task ExecuteResultAsync(ActionContext context)
    {
        context.HttpContext.Response.Headers.Add("Content-Type", new Microsoft.Extensions.Primitives.StringValues("application/json; charset=utf-8"));
        var stringWriter = new StringWriter();
        _formatter.WriteValue(stringWriter, _obj);
        await context.HttpContext.Response.WriteAsync(stringWriter.ToString());
    }
}

C# で開発をされている諸先輩方が使っていたので必須なのかなぁとまねしてたのですが…。

実はいらなかった

作らなくてもよかったみたいです。

return new OkObjectResult(webhookResponse.ToString());

というようにレスポンスのオブジェクトを ToString() するだけでシンプルに返却できました。

関数コード全体だとこんなかんじです。

※もはや会話でもなんでもないですが…

using Google.Cloud.Dialogflow.V2;
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;

namespace Sample
{
    public static class GoogleEndpoint
    {
        [FunctionName(nameof(GoogleEndpoint))]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            var parser = new JsonParser(JsonParser.Settings.Default.WithIgnoreUnknownFields(true));
            var webhookRequest = parser.Parse<WebhookRequest>(await req.ReadAsStringAsync());
            var webhookResponse = new WebhookResponse();

            switch (webhookRequest.QueryResult.Intent.DisplayName)
            {
                case "Default Welcome Intent":
                    webhookResponse.FulfillmentText = "こんにちは。";
                    break;

                case "CustomIntent":
                    webhookResponse.FulfillmentText = "そうですね。";
                    break;

                case "Default Fallback Intent":
                default:
                    webhookResponse.FulfillmentText = "特に何もしません。";
                    break;
            }

            return new OkObjectResult(webhookResponse.ToString());
        }
    }
}

おわりに

意外と簡単にできるなぁという気づきでした。

技術書典で頒布する本では上記の書き方で書いてます。

頒布するのは Azure && (C# || ノンコーディング) でクロスプラットフォームスマートスピーカースキル開発する本で、順番にやっていくとAzureのPaaSとスマートスピーカースキル開発両方をマスターできるように構成してます!

『AzureでつくるクロスプラットフォームAIアシスタントスキル』、興味のある方はぜひm(_ _)m

サークルチェックもお願いします!

techbookfest.org