独立Web应用程序

函数可以自动导出为HTTP端点。spring-doc.cadn.net.cn

模块 spring-cloud-function-web 具有自动配置功能,当它被包含在 Spring Boot Web 应用程序(支持 MVC)中时会自动激活。此外,还有一个 spring-cloud-starter-function-web,用于收集所有可选依赖项,以便您只需一个简单的入门体验即可。spring-doc.cadn.net.cn

启用Web配置后,您的应用将拥有一个MVC端点(默认位于“/”路径,但可通过spring.cloud.function.web.path进行配置),可用于访问应用上下文中的函数,其中函数名称将成为URL路径的一部分。支持的内容类型包括纯文本和JSON。spring-doc.cadn.net.cn

重要的是要理解,虽然 SCF 提供了将功能 Bean 导出为 REST 端点的能力,但它并不是 Spring MVC/WebFlux 等框架的替代品。

spring-doc.cadn.net.cn

其主要目的是为了适应 无状态无服务器模式,即您仅希望将一些无状态功能通过 HTTP 暴露出来。spring-doc.cadn.net.cn

方法 路径 请求 响应 状态

GETspring-doc.cadn.net.cn

/{supplier}spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

来自指定提供商的商品spring-doc.cadn.net.cn

200 OKspring-doc.cadn.net.cn

POSTspring-doc.cadn.net.cn

/{consumer}spring-doc.cadn.net.cn

JSON 对象或文本spring-doc.cadn.net.cn

镜像输入并将请求体推送到消费者spring-doc.cadn.net.cn

202 已接受spring-doc.cadn.net.cn

PUTspring-doc.cadn.net.cn

/{consumer}spring-doc.cadn.net.cn

JSON 对象或文本spring-doc.cadn.net.cn

镜像输入并将请求体推送到消费者spring-doc.cadn.net.cn

202 已接受spring-doc.cadn.net.cn

删除spring-doc.cadn.net.cn

/{consumer}spring-doc.cadn.net.cn

JSON 对象或文本spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

204 无内容spring-doc.cadn.net.cn

POSTspring-doc.cadn.net.cn

/{function}spring-doc.cadn.net.cn

JSON 对象或文本spring-doc.cadn.net.cn

应用命名函数后的结果spring-doc.cadn.net.cn

200 OKspring-doc.cadn.net.cn

PUTspring-doc.cadn.net.cn

/{function}spring-doc.cadn.net.cn

JSON 对象或文本spring-doc.cadn.net.cn

应用命名函数后的结果spring-doc.cadn.net.cn

200 OKspring-doc.cadn.net.cn

GETspring-doc.cadn.net.cn

/{function}/{item}spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

将项目转换为对象,并返回应用该函数后的结果spring-doc.cadn.net.cn

200 OKspring-doc.cadn.net.cn

如上表所示,端点的行为取决于方法以及传入请求数据的类型。当传入的数据为单值且目标函数明确声明为单值(即不返回集合或Flux)时,响应中也将包含单个值。对于多值响应,客户端可通过发送Accept: text/event-stream来请求服务器发送事件流。spring-doc.cadn.net.cn

函数和 consumers 都会将请求头作为 0 ,并将输出消息头转换为 HTTP 头。消息的 有效负载 是一个 1 或空字符串,如果无 2 或它为 null。spring-doc.cadn.net.cn

当使用 Spring Boot 2.0 提交文本时,响应格式可能因内容协商(为获得最佳效果提供内容类型和接受标头)而有所不同。spring-doc.cadn.net.cn

请参阅[测试功能型应用程序]了解详情和使用示例。spring-doc.cadn.net.cn

请求参数

你已经注意到上表中,您可以将参数作为路径变量传递给函数(例如 /{function}/{item})。
例如,localhost:8080/uppercase/foo 将导致调用 uppercase 函数,其输入参数为 foo
spring-doc.cadn.net.cn

虽然这是推荐的方法,也是最适合大多数用例的方法,但在某些情况下,您必须处理HTTP请求参数(例如localhost:8080/uppercase/foo?name=Bill)。框架会将HTTP请求参数视为与HTTP头相似,在Message标头下存储它们,键为http_request_param,值为请求参数的Map,因此,您的函数输入签名应接受Message类型(例如Function<Message<String>, String>])。为了方便,我们提供HeaderUtils.HTTP_REQUEST_PARAM常量。spring-doc.cadn.net.cn

功能映射规则

如果在目录中只有一个函数(消费者等),则路径中的名称是可选的。
换句话说,如果您只在目录中有 uppercase个函数,则
curl -H "Content-Type: text/plain" localhost:8080/uppercase -d hellocurl -H "Content-Type: text/plain" localhost:8080/ -d hello的调用是相同的。spring-doc.cadn.net.cn

复合函数可以使用管道或逗号分隔函数名来表示(管道在URL路径中是合法的,但在命令行上有点难输入)
例如,curl -H "Content-Type: text/plain" localhost:8080/uppercase,reverse -d hello
spring-doc.cadn.net.cn

对于catalog中有多于一个函数的情况,每个函数都将被导出并映射到函数名是路径一部分(例如localhost:8080/uppercase)的路径。在这种情况下,您仍然可以通过提供spring.cloud.function.definition属性将特定函数或函数组合映射到根路径。spring-doc.cadn.net.cn

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

该属性将对'foo'和'bar'函数进行组合,并将生成的函数映射到'/'路径。spring-doc.cadn.net.cn

同样,当函数无法通过 URL 解决时,此属性也将起作用。例如,您的 URL 可能是 localhost:8080/uppercase,但没有 uppercase 函数。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

不过,有函数 foobar。所以,在这种情况下,localhost:8080/uppercase 将解析为 foo|barspring-doc.cadn.net.cn

这尤其对当 URL 用于传达某些信息的情况很有用,因为消息标头中将有一个名为 uri 的值spring-doc.cadn.net.cn

实际 URL,使用户能够使用它进行评估和计算。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

功能过滤规则

在函数目录中存在多个函数的情况下,可能需要仅导出某些函数或函数组合。 在这种情况下,可以使用与 0 属性,其中列出要导出的函数,用 1 分隔。 请注意,在这种情况下,根路径不会映射到任何内容,并且未列出(包括组合)的函数将不被导出。spring-doc.cadn.net.cn

--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-doc.cadn.net.cn

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

此操作将只导出函数组合foo|bar和函数baz,无论目录中可用多少个函数(例如localhost:8080/foo,bar)。 spring-doc.cadn.net.cn

HTTP 头信息传播

默认情况下,大多数请求 0 被复制到响应 1 中。如果需要过滤出某些标头,您可以使用它们的名称提供 2 由逗号分隔。例如, 3 spring-doc.cadn.net.cn

CRUD REST with Spring Cloud Function

到此为止,应该已经很清楚了:函数被导出为REST端点,并可通过多种HTTP方法进行调用。换句话说,单个函数可以通过GET、POST、PUT等方法触发。spring-doc.cadn.net.cn

然而,并不总是可取,尤其是在CRUD概念中也不一定适用。虽然SCF不支持并且无意支持Spring web stack的所有功能,但该框架确实提供了对CRUD映射的支持,其中单个功能可以映射到特定的HTTP方法(s)。 这是通过spring.cloud.function.http.<method-name>属性实现的。spring-doc.cadn.net.cn

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

我们看到,这里我们使用与属性 0 相同的规则,根据各种 HTTP 方法映射函数,其中分号允许我们定义多个函数,竖线表示函数组合。spring-doc.cadn.net.cn