|
对于最新稳定版本,请使用 spring-cloud-function 5.0.0! |
独立的网页应用
函数可以自动导出为HTTP端点。
这Spring-cloud-function-web模块具有自动配置
当它被包含在 Spring Boot 网页应用中时(具有
车祸支持)。还有一个Spring-cloud-starter-function-web自
收集所有可选依赖,以防你只想要一个简单的
入门经验。
激活了网页配置后,你的应用将出现 MVC
端点(默认为“/”,但可配置为spring.cloud.function.web.path)可用于访问
在应用上下文中,函数名称成为 URL 路径的一部分。支持的内容类型有
纯文本和JSON。
| 需要理解的是,虽然SCF支持导出函数式豆作为REST端点的功能,但它并不是Spring、MVC、WebFlux等的替代品。 它主要是为了支持无状态的无服务器模式,即你只是想通过HTTP暴露一些无状态功能。 |
| 方法 | 路径 | 请求 | 响应 | 地位 |
|---|---|---|---|---|
获取 |
/{提供商} |
- |
来自指定提供商的物品 |
200 OK |
发布 |
/{消费者} |
JSON 对象或文本 |
镜像输入并将请求体推送给消费者 |
202 已接受 |
放 |
/{消费者} |
JSON 对象或文本 |
镜像输入并将请求体推送给消费者 |
202 已接受 |
删除 |
/{消费者} |
JSON 对象或文本 |
- |
204 无内容 |
发布 |
/{函数} |
JSON 对象或文本 |
应用命名函数的结果 |
200 OK |
放 |
/{函数} |
JSON 对象或文本 |
应用命名函数的结果 |
200 OK |
获取 |
/{function}/{item} |
- |
将该项转换为对象,返回应用该函数的结果 |
200 OK |
如上表所示,端点的行为取决于方法以及输入请求数据的类型。当输入数据为单值,且目标函数被声明为明显单值(即不返回集合或通量),则响应中也包含一个值。
对于多值响应,客户端可以通过发送以下方式请求服务器发送的事件流接受:文本/事件流.
在留言<?>将请求头视为消息头,输出消息头将转换为HTTP头。
消息的有效载荷将是身体或空字符串,若不存在身体或者它是无效的。
在发布文本时,Spring Boot 2.0及更早版本的响应格式可能不同,具体取决于内容协商(提供内容类型并接受首部以获得最佳结果)。
参见[测试功能应用],了解如何测试此类应用的详细内容和示例。
HTTP 请求参数
正如你从前表中注意到的,你可以将参数作为路径变量传递给函数(即,/{function}/{item}). 例如localhost:8080/大写/foo将导致呼唤大写函数,其输入参数为福.
虽然这是推荐的方法,也适用于大多数用例,但有时你必须处理HTTP请求参数(例如,localhost:8080/uppercase/foo?name=Bill). 该框架将通过存储在消息头部键下的首部http_request_param其值为地图请求参数,因此为了访问它们,你的函数输入签名必须接受消息类型(例如,Function<Message<String>, String>). 为了方便,我们提供以下服务HeaderUtils.HTTP_REQUEST_PARAM不断。
函数映射规则
如果目录中只有一个函数(消费者等),路径中的名称是可选的。换句话说,前提是你只有大写目录功能curl -H “内容类型:文本/普通” localhost:8080/大写 -d hello和curl -H “内容类型:文本/普通” localhost:8080/ -d hello呼叫完全相同。
复合函数可以通过管道或逗号来分隔函数名称(管道在 URL 路径中是合法的,但在命令行输入时会有些不便)。 例如curl -H “内容类型:文本/普通” localhost:8080/大写,反向 -d hello.
对于目录中存在多个函数的情况,每个函数都会被导出并映射,函数名称为路径的一部分(例如,localhost:8080/大写). 在这种情况下,你仍然可以通过提供spring.cloud.function.definition属性
例如
--spring.cloud.function.definition=foo|bar
上述属性将组合“foo”和“bar”函数,并将组合后的函数映射到“/”路径。
同样的属性也适用于无法通过 URL 解析函数的情况。例如,你的 URL 可能是localhost:8080/大写,但没有大写功能。 然而,存在函数福和酒吧. 所以,在这种情况下localhost:8080/大写将解决为foo|bar. 这在使用 URL 传递特定信息时尤其有用,因为会调用 Message 头乌里其值是实际URL的,使用户能够使用它进行评估和计算。
函数过滤规则
在目录中存在多个函数的情况下,可能需要只导出某些函数或函数组合。在这种情况下,你可以使用 一样spring.cloud.function.definition你打算导出的属性列表函数,用 为 进行分隔。注意,在这种情况下,任何函数都不会映射到根路径,未列出的函数(包括组合)也不会被导出。;
例如
--spring.cloud.function.definition=foo;bar
这只会导出函数福以及功能酒吧无论目录中有多少功能(例如,localhost:8080/foo).
--spring.cloud.function.definition=foo|bar;baz
这只会导出函数组合foo|bar以及功能巴兹无论目录中有多少功能(例如,本地主持人:8080/foo,bar(bar)).
Http 头部传播
默认情况下,大多数请求HttpHeaders被复制到回复中HttpHeaders. 如果你需要过滤掉某些头部,可以用以下方式提供这些头部的名称spring.cloud.function.http.ignored-headers以昏迷区为界。 例如spring.cloud.function.http.ignored-headers=foo,bar.
CRUD REST with Spring Cloud 函数
现在应该很清楚,函数是导出为 REST 端点的,并且可以通过各种 HTTP 方法调用。换句话说,单个函数可以通过 GET、POST、PUT 等触发。
然而,这并非总是理想,也绝不符合 CRUD 的概念。虽然 SCF 不支持也无意支持Spring Web Stack 的所有功能,但该框架支持 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其中“;”允许定义多个函数,“|”表示函数复合。