此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 spring-cloud-function 4.1.4! |
独立 Web 应用程序
函数可以自动导出为 HTTP 端点。
该模块具有自动配置
当它包含在 Spring Boot Web 应用程序中时激活(使用
MVC 支持)。还有一个 to
收集所有可选的依赖项,以防您只想要一个简单的
入门体验。spring-cloud-function-web
spring-cloud-starter-function-web
激活 Web 配置后,您的应用将具有 MVC
端点(默认为 “/”,但可配置为 ),可用于访问
函数,其中函数名称成为 URL 路径的一部分。支持的内容类型包括
纯文本和 JSON 的 JSON 文件。spring.cloud.function.web.path
重要的是要了解,虽然 SCF 提供了将功能 bean 导出为 REST 端点的能力,但它不能替代 Spring MVC/WebFlux 等。 它主要是为了适应无状态无服务器模式,在这种情况下,您只想通过 HTTP 公开一些无状态功能。 |
方法 | 路径 | 请求 | 响应 | 地位 |
---|---|---|---|---|
获取 |
/{供应商} |
- |
来自指定供应商的物料 |
200 确定 |
发布 |
/{消费者} |
JSON 对象或文本 |
镜像输入并将请求正文推送到 Consumer 中 |
202 接受 |
放 |
/{消费者} |
JSON 对象或文本 |
镜像输入并将请求正文推送到 Consumer 中 |
202 接受 |
删除 |
/{消费者} |
JSON 对象或文本 |
- |
204 没有 |
发布 |
/{功能} |
JSON 对象或文本 |
应用命名函数的结果 |
200 确定 |
放 |
/{功能} |
JSON 对象或文本 |
应用命名函数的结果 |
200 确定 |
获取 |
/{功能}/{项目} |
- |
将项目转换为对象并返回应用函数的结果 |
200 确定 |
如上表所示,端点的行为取决于方法以及传入请求数据类型。当传入数据是单值,并且目标函数被声明为明显的单值(即不返回集合或 )时,响应也将包含一个值。
对于多值响应,客户端可以通过发送 .Flux
Accept: text/event-stream
使用 input 和 output 声明的函数和使用者会将请求标头视为消息标头,并且输出消息标头将转换为 HTTP 标头。
Message 的有效负载将为 a 或空字符串(如果没有或为 null)。Message<?>
body
body
当 POST 文本时,响应格式可能与 Spring Boot 2.0 及更早版本不同,具体取决于内容协商(提供内容类型并接受标头以获得最佳结果)。
请参阅 [测试功能应用程序] 以查看有关如何测试此类应用程序的详细信息和示例。
HTTP 请求参数
正如您在上表中所注意到的,您可以将参数作为路径变量(即 )传递给函数。
例如,将导致调用 function 的输入参数为 。/{function}/{item}
localhost:8080/uppercase/foo
uppercase
foo
虽然这是推荐的方法,并且适合大多数用例,但有时您必须处理 HTTP 请求参数(例如。
框架将 HTTP 请求参数视为类似于 HTTP 标头,方法是将它们存储在标头键下的标头中,其值为请求参数的 a,因此为了访问它们,您的函数输入签名应接受类型(例如,)。为方便起见,我们提供 constant.localhost:8080/uppercase/foo?name=Bill
Message
http_request_param
Map
Message
Function<Message<String>, String>
HeaderUtils.HTTP_REQUEST_PARAM
函数映射规则
如果目录中只有一个函数 (使用者等),则路径中的名称是可选的。
换句话说,前提是您只有 catalog 中的函数并且调用是相同的。uppercase
curl -H "Content-Type: text/plain" localhost:8080/uppercase -d hello
curl -H "Content-Type: text/plain" localhost:8080/ -d hello
可以使用竖线或逗号来分隔函数名称(竖线在 URL 路径中是合法的,但在命令行上键入有点笨拙)。
例如。curl -H "Content-Type: text/plain" localhost:8080/uppercase,reverse -d hello
对于 catalog 中有多个函数的情况,每个函数将被导出并映射为函数名称
路径的一部分(例如 )。
在这种情况下,您仍然可以通过提供属性localhost:8080/uppercase
spring.cloud.function.definition
例如
--spring.cloud.function.definition=foo|bar
上述属性将组合 'foo' 和 'bar' 函数,并将组合函数映射到 “/” 路径。
相同的属性也适用于无法通过 URL 解析函数的情况。例如,您的 URL 可能是 ,但没有函数。
但是,有 function 和 .因此,在这种情况下,将解析为 。
这对于使用 URL 来传达某些信息的情况尤其有用,因为将使用值
,使用户能够使用它进行评估和计算。localhost:8080/uppercase
uppercase
foo
bar
localhost:8080/uppercase
foo|bar
uri
函数筛选规则
在 catalog 中存在多个函数的情况下,可能只需要导出某些函数或函数组合。在这种情况下,您可以使用
列出要导出的相同属性函数(以 .
请注意,在这种情况下,不会将任何内容映射到根路径,并且不会导出未列出的函数(包括合成)。spring.cloud.function.definition
;
例如
--spring.cloud.function.definition=foo;bar
这将仅导出函数和函数,而不管目录中有多少个函数可用(例如,)。foo
bar
localhost:8080/foo
--spring.cloud.function.definition=foo|bar;baz
这将仅导出函数组合和函数,而不管 catalog 中有多少个函数可用(例如 )。foo|bar
baz
localhost:8080/foo,bar
Http Headers 传播
默认情况下,大多数请求都会复制到响应中 。如果需要筛选出某些标头,可以使用逗号分隔来提供这些标头的名称。例如。HttpHeaders
HttpHeaders
spring.cloud.function.http.ignored-headers
spring.cloud.function.http.ignored-headers=foo,bar
带有 Spring Cloud 函数的 CRUD REST
到目前为止,应该很清楚函数被导出为 REST 端点,并且可以使用各种 HTTP 方法调用。换句话说,单个 函数可以通过 GET、POST、PUT 等触发。
但是,这并不总是可取的,当然也不符合 CRUD 概念。虽然 SCF 不支持,也无意支持 Spring Web 堆栈的所有功能,该框架确实提供了对 CRUD 映射的支持,其中单个函数可以映射到特定的 HTTP 方法。 它是通过 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
正如你所看到的,这里我们使用与属性相同的规则将函数映射到各种 HTTP 方法,其中 “;” 允许我们定义多个函数,而 “|” 表示函数组合。spring.cloud.function.definition