最新の安定バージョンについては、spring-cloud-function 4.3.0 を使用してください。

スタンドアロン Web アプリケーション

関数は、HTTP エンドポイントとして自動的にエクスポートできます。

spring-cloud-function-web モジュールには、Spring Boot Web アプリケーション(MVC サポート付き)に含まれているときにアクティブになる自動構成があります。簡単な開始体験が必要な場合に備えて、すべてのオプションの依存関係を収集する spring-cloud-starter-function-web もあります。

Web 構成をアクティブにすると、アプリには MVC エンドポイント(デフォルトでは "/" にありますが、spring.cloud.function.web.path で構成可能)があり、関数名が URL パスの一部になるアプリケーションコンテキストで関数にアクセスするために使用できます。サポートされているコンテンツ型はプレーンテキストと JSON です。

SCF は Functional Bean を REST エンドポイントとしてエクスポートする機能を提供しますが、Spring MVC/WebFlux などの代替ではないことを理解することが重要です。SCF は主に、ステートレス機能を HTTP 経由で公開したいだけのステートレスサーバーレスパターンに対応するためのものです。
メソッド パス リクエスト レスポンス ステータス

GET

/{supplier}

-

指定されたサプライヤーからのアイテム

200 OK

POST

/{consumer}

JSON オブジェクトまたはテキスト

入力をミラーリングし、リクエスト本文をコンシューマーにプッシュします

202 承認済み

PUT

/{consumer}

JSON オブジェクトまたはテキスト

入力をミラーリングし、リクエスト本文をコンシューマーにプッシュします

202 承認済み

DELETE

/{consumer}

JSON オブジェクトまたはテキスト

-

204 コンテンツがありません

POST

/{function}

JSON オブジェクトまたはテキスト

名前付き関数を適用した結果

200 OK

PUT

/{function}

JSON オブジェクトまたはテキスト

名前付き関数を適用した結果

200 OK

GET

/{function}/{item}

-

アイテムをオブジェクトに変換し、関数を適用した結果を返します

200 OK

上の表が示すように、エンドポイントの動作はメソッドと受信リクエストデータの型によって異なります。受信データが単一値であり、ターゲット関数が明らかに単一値として宣言されている場合 (つまり、コレクションまたは Flux を返さない場合)、レスポンスにも単一値が含まれます。複数値のレスポンスの場合、クライアントは Accept: text/event-stream を送信することで、サーバーから送信されたイベントストリームをリクエストできます。

Message<?> で入力と出力を使用して宣言された関数とコンシューマーは、リクエストヘッダーをメッセージヘッダーとして認識し、出力メッセージヘッダーは HTTP ヘッダーに変換されます。body がない場合、または null の場合、メッセージのペイロードは body または空の文字列になります。

テキストを POST する場合、レスポンス形式は、コンテンツネゴシエーションに応じて、Spring Boot 2.0 以前のバージョンとは異なる場合があります(最良の結果を得るには、コンテンツ型を指定し、ヘッダーを受け入れます)。

このようなアプリケーションをテストする方法の詳細と例については、[ 関数アプリケーションのテスト ] を参照してください。

HTTP リクエストパラメーター

前の表からお気づきのように、引数をパス変数(つまり、/{function}/{item})として関数に渡すことができます。例: localhost:8080/uppercase/foo は、入力パラメーターが foo である uppercase 関数を呼び出します。

これは推奨されるアプローチであり、ほとんどのユースケースに適合しますが、HTTP リクエストパラメーター (例: localhost:8080/uppercase/foo?name=Bill) を処理しなければならない場合があります。フレームワークは、HTTP リクエストパラメーターを HTTP ヘッダーと同様に扱い、ヘッダーキー http_request_param の Message ヘッダーに格納します。その値はリクエストパラメーターの Map になります。そのため、それらにアクセスするには、関数の入力シグネチャーで Message 型 (例: Function<Message<String>, String>) を受け入れる必要があります。便宜上、HeaderUtils.HTTP_REQUEST_PARAM 定数を提供します。

関数マッピングルール

カタログに関数(コンシューマーなど)が 1 つしかない場合、パス内の名前はオプションです。つまり、カタログ curl -H "Content-Type: text/plain" localhost:8080/uppercase -d hello に uppercase 関数しかない場合、curl -H "Content-Type: text/plain" localhost:8080/ -d hello 呼び出しは同じです。

複合関数は、パイプまたはコンマを使用して関数名を区切ることができます(パイプは、URL パスでは有効ですが、コマンドラインで入力するのは少し厄介です)。例: curl -H "Content-Type: text/plain" localhost:8080/uppercase,reverse -d hello

カタログに複数の関数がある場合、各関数はエクスポートされ、関数名がパスの一部としてマップされます (例: localhost:8080/uppercase)。このシナリオでは、spring.cloud.function.definition プロパティを提供することで、特定の関数または関数構成をルートパスにマップできます。

以下に例を示します。

--spring.cloud.function.definition=foo|bar

上記のプロパティは、"foo" および "bar" 関数を構成し、構成された関数を "/" パスにマップします。

同じプロパティは、URL を介して関数を解決できない場合にも機能します。例: URL は localhost:8080/uppercase である可能性がありますが、uppercase 関数はありません。ただし、関数 foo と bar があります。この場合、localhost:8080/uppercase は foo|bar に解決されます。これは、URL を使用して特定の情報を伝達する場合に特に役立ちます。これは、実際の URL の値を含む uri というメッセージヘッダーがあり、ユーザーがそれを評価と計算に使用できるようにするためです。

関数フィルタリングルール

カタログに複数の関数がある場合、特定の関数または関数構成のみをエクスポートする必要がある場合があります。その場合は、エクスポートする関数を ; で区切ってリストした同じ spring.cloud.function.definition プロパティを使用できます。この場合、ルートパスに何もマップされず、リストされていない関数 (構成を含む) はエクスポートされないことに注意してください。

以下に例を示します。

--spring.cloud.function.definition=foo;bar

これにより、カタログで使用可能な関数の数(localhost:8080/foo など)に関係なく、関数 foo と関数 bar のみがエクスポートされます。

--spring.cloud.function.definition=foo|bar;baz

これにより、カタログで使用可能な関数の数(localhost:8080/foo,bar など)に関係なく、関数構成 foo|bar と関数 baz のみがエクスポートされます。

HTTP ヘッダーの伝播

デフォルトでは、ほとんどのリクエスト HttpHeaders がレスポンス HttpHeaders にコピーされます。特定のヘッダーをフィルター処理する必要がある場合は、コンマで区切られた spring.cloud.function.http.ignored-headers を使用してそれらのヘッダーの名前を指定できます。例: spring.cloud.function.http.ignored-headers=foo,bar

Spring Cloud Function と CRUD REST

ここまでで、関数が REST エンドポイントとしてエクスポートされ、さまざまな HTTP メソッドを使用して呼び出せることが明確になったはずです。言い換えれば、GET、POST、PUT などを介して単一の関数をトリガーできます。

ただし、これは常に望ましいとは限らず、CRUD の概念には当てはまりません。また、SCF は Spring Web スタックのすべての機能をサポートしておらず、サポートするつもりもありませんが、フレームワークは、単一の関数を特定の HTTP メソッドにマッピングできる CRUD マッピングのサポートを提供します。これは、spring.cloud.function.http.<method-name> プロパティによって実行されます。

以下に例を示します。

spring.cloud.function.http.GET=uppercase;reverse;foo|bar
spring.cloud.function.http.POST=reverse
spring.cloud.function.http.DELETE=deleteById

ご覧のとおり、ここでは spring.cloud.function.definition プロパティと同じルールを使用して関数をさまざまな HTTP メソッドにマッピングしています。を使用すると、いくつかの関数を定義できます。」は機能構成を意味します。