REST と関数ルート

完了

すばらしい API を作成しました。 多くの機能はありませんが、こうして存在するということは、今すぐ API をビルドしない人以上のことを語れるわけです。

RESTful API への移行

CreateProduct、GetProducts、UpdateProduct、DeleteProduct という名前のエンドポイントがあります。 このように名前が付けられたエンドポイントは、従来の API の名前付けパターン (アクション/リソース) に従っています。

小規模の API の場合、"アクション/リソース" という名前付けパターンで十分です。 ただし、このシミュレーションでは、Tailwind Traders はインターネットの巨大企業であることを忘れないでください。 Products API はすぐに手に負えなくなるおそれがあります。 たとえば、"GetProductByIdAndQuantityAndDate" という名前のメソッドがあると想像してください。この種のメソッド名は冗長であるだけでなく、それを使用するコードが乱雑に見えます。 また、API 名が冗長であると、プロジェクトで API を利用する方法が開発者にとってわかりにくくなります。

何をする必要があるかわかっていれば、この API は簡潔で、直観的なものになります。 そのため、REST パターンを使います。

Azure Functions ルートと HTTP 要求メソッド

Azure Functions の場合、既定では、HTTP トリガー関数が GET および POST 要求に応答します。 また、関数の URL には、その関数の名前の先頭に "/api" を付けたものが設定されます。これらの両方を、移動 RESTful パターンに移動するように構成します。

エンタープライズ アプリケーション

このサンプル アプリケーションの Azure Functions v4 プログラミング モデルでの API に対する HTTP 定義は、./api/src/index.ts で確認でき、次のパターンに従っています。

const { app } = require('@azure/functions');

app.http('FunctionName',{
    methods: ['GET', 'POST'], 
    authLevel: 'anonymous', 
    route: 'routeName',
    handler: handlerFunction
});

ハンドラー関数は、HTTP トリガーの定義から切り離されています。 これにより、非常に柔軟に関数を定義できます。 ハンドラー関数を別のファイルで定義して、index.ts ファイルにインポートできます。 この形式を使うと、OpenAPI または Swagger のドキュメントの保守や生成が容易になります。

小さなアプリケーション

小さなアプリケーションでは、ハンドラー コードを app の呼び出しに直接統合し、アプリのメソッドを使って HTTP のメソッドを指定すると、提供しやすくなる場合があります。 その場合でも、ハンドラー関数を分離することも、コードを統合することもできます。

HTTP メソッドとハンドラー関数を指定するには、app.get メソッドを使います。

const { app } = require('@azure/functions');

app.get('FunctionName', handlerFunction);

関数が 1 つの関数アプリに最適なもう 1 つの代替形式は、ハンドラーのコードを app の呼び出しに直接統合し、アプリのメソッドを使って HTTP メソッドを指定することです。 次に例を示します。

const { app } = require('@azure/functions');

app.get('helloWorld',{
    handler: (request: HttpRequest, context: InvocationContext) => {
        return {
            status: 200,
            body: "Hello World"
        }
    }
}

ルート パラメーター

route パラメーターを使って、パラメーターを受け取るルートを定義することもできます。 たとえば、次のコードでは、name パラメーターを受け取るルートを定義しています。

route: "products"

完全なルート定義は次のとおりです。

app.http('GetProducts', {
    methods: ['GET', 'POST'],
    route: 'products',          // <- route: /api/products
    authLevel: 'anonymous',
    handler: GetProducts
});

ルートを指定すると、URL の api セクションの後のすべてが変更されます。 前の構成ファイルでは、GetProducts 関数へのルートが http://localhost:7071/api/products になりました。

ルートと共にパラメーターを渡すことができます。 パラメーターの形式は、{parameterName} です。 つまり、id というパラメーターを product エンドポイントに渡すには、次のルートを指定します。

route: "products/{id}"

REST およびそれを Azure Functions に実装する方法に関するこの新しい知識を得て、この扱いにくい Products API を RESTful にすることができるようになりました。 次の演習では、まさにこの操作を実行します。