|
此版本仍在开发中,目前尚不被视为稳定版本。如需最新稳定版本,请使用 spring-cloud-function 5.0.1! |
独立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 提供了将功能 Bean 导出为 REST 端点的能力,但它并不是 Spring MVC/WebFlux 等框架的替代品。 其主要目的是为了适应 无状态无服务器模式,即您仅希望将一些无状态功能通过 HTTP 暴露出来。 |
| 方法 | 路径 | 请求 | 响应 | 状态 |
|---|---|---|---|---|
GET |
/{supplier} |
- |
来自指定提供商的商品 |
200 OK |
POST |
/{consumer} |
JSON 对象或文本 |
镜像输入并将请求体推送到消费者 |
202 已接受 |
PUT |
/{consumer} |
JSON 对象或文本 |
镜像输入并将请求体推送到消费者 |
202 已接受 |
删除 |
/{consumer} |
JSON 对象或文本 |
- |
204 无内容 |
POST |
/{function} |
JSON 对象或文本 |
应用命名函数后的结果 |
200 OK |
PUT |
/{function} |
JSON 对象或文本 |
应用命名函数后的结果 |
200 OK |
GET |
/{function}/{item} |
- |
将项目转换为对象,并返回应用该函数后的结果 |
200 OK |
如上表所示,端点的行为取决于方法以及传入请求数据的类型。当传入的数据为单值且目标函数明确声明为单值(即不返回集合或Flux)时,响应中也将包含单个值。对于多值响应,客户端可通过发送Accept: text/event-stream来请求服务器发送事件流。
函数和 consumers 都会将请求头作为 0 ,并将输出消息头转换为 HTTP 头。消息的 有效负载 是一个 1 或空字符串,如果无 2 或它为 null。
当使用 Spring Boot 2.0 提交文本时,响应格式可能因内容协商(为获得最佳效果提供内容类型和接受标头)而有所不同。
请参阅[测试功能型应用程序]了解详情和使用示例。
请求参数
你已经注意到上表中,您可以将参数作为路径变量传递给函数(例如 /{function}/{item})。
例如,localhost:8080/uppercase/foo 将导致调用 uppercase 函数,其输入参数为 foo。
虽然这是推荐的方法,也是最适合大多数用例的方法,但在某些情况下,您必须处理HTTP请求参数(例如localhost:8080/uppercase/foo?name=Bill)。框架会将HTTP请求参数视为与HTTP头相似,在Message标头下存储它们,键为http_request_param,值为请求参数的Map,因此,您的函数输入签名应接受Message类型(例如Function<Message<String>, String>])。为了方便,我们提供HeaderUtils.HTTP_REQUEST_PARAM常量。
功能映射规则
如果在目录中只有一个函数(消费者等),则路径中的名称是可选的。
换句话说,如果您只在目录中有
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 可能是 localhost:8080/uppercase,但没有 uppercase 函数。
不过,有函数 foo 和 bar。所以,在这种情况下,localhost:8080/uppercase 将解析为 foo|bar。
这尤其对当 URL 用于传达某些信息的情况很有用,因为消息标头中将有一个名为 uri 的值
实际 URL,使用户能够使用它进行评估和计算。
功能过滤规则
在函数目录中存在多个函数的情况下,可能需要仅导出某些函数或函数组合。 在这种情况下,可以使用与 0 属性,其中列出要导出的函数,用 1 分隔。 请注意,在这种情况下,根路径不会映射到任何内容,并且未列出(包括组合)的函数将不被导出。
例如,
--spring.cloud.function.definition=foo;bar
This will only export function foo and function bar regardless how many functions are available in catalog (e.g., localhost:8080/foo).
--spring.cloud.function.definition=foo|bar;baz
此操作将只导出函数组合foo|bar和函数baz,无论目录中可用多少个函数(例如localhost:8080/foo,bar)。
CRUD REST with Spring Cloud Function
到此为止,应该已经很清楚了:函数被导出为REST端点,并可通过多种HTTP方法进行调用。换句话说,单个函数可以通过GET、POST、PUT等方法触发。
然而,并不总是可取,尤其是在CRUD概念中也不一定适用。虽然SCF不支持并且无意支持Spring web stack的所有功能,但该框架确实提供了对CRUD映射的支持,其中单个功能可以映射到特定的HTTP方法(s)。 这是通过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
我们看到,这里我们使用与属性 0 相同的规则,根据各种 HTTP 方法映射函数,其中分号允许我们定义多个函数,竖线表示函数组合。