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 にすることができるようになりました。 次の演習では、まさにこの操作を実行します。