Funqy HTTP 绑定(独立)
本指南将引导您完成快速入门代码,向您展示如何将 Funqy 部署为独立服务,并使用 HTTP 调用 Funqy 函数。
Funqy HTTP 绑定不能替代 REST over HTTP。由于 Funqy 需要在许多不同的协议和函数提供者之间具有可移植性,因此其 HTTP 绑定非常简约,您将失去 REST 功能,如链接和利用 HTTP 功能(如缓存控制和条件 GET)。您可能需要考虑使用 Quarkus 的 Jakarta REST、Spring MVC 或 Vert.x Web Reactive Routes 支持,尽管 Funqy 的开销将低于这些替代方案(Vert.x 除外,它仍然非常快)。 |
先决条件
要完成本指南,您需要
-
大约 15 分钟
-
一个 IDE
-
已安装 JDK 17+ 并正确配置了
JAVA_HOME
-
Apache Maven 3.9.9
-
如果您想使用它,可以选择 Quarkus CLI
-
阅读关于 Funqy 基础。 这是一篇简短的阅读!
快速入门
克隆 Git 存储库:git clone https://github.com/quarkusio/quarkus-quickstarts.git
,或下载一个 存档。
解决方案位于 funqy-http-quickstart
目录中。
Maven 依赖项
要编写 Funqy HTTP 函数,只需将 quarkus-funqy-http
依赖项包含到您的 Quarkus pom.xml
文件中。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-funqy-http</artifactId>
</dependency>
执行 Funqy HTTP 函数
执行函数的 URL 路径是函数名。例如,如果您的函数名为 foo
,则执行函数的 URL 路径为 /foo
。
HTTP POST 或 GET 方法可用于调用函数。使用 Jackson JSON 库将函数的返回值编组为 JSON。可以使用 Jackson 注释。如果您的函数具有输入参数,则 POST 调用必须使用 JSON 作为输入类型。Jackson 也用于此处进行解组。
您可以通过将浏览器指向 https://:8080/hello 来调用 PrimitiveFunctions.java 中定义的 hello
函数。
调用快速入门中的其他函数需要 HTTP POST。要执行 GreetingFunction.java 中定义的 greet
函数,请调用此 curl 脚本。
curl "https://:8080/greet" \
-X POST \
-H "Content-Type: application/json" \
-d '{"name":"Bill"}'
原始类型也可以通过标准 JSON 映射作为输入传递。要执行 PrimitiveFunctions.java 中定义的 toLowerCase
函数,请调用此 curl 脚本。
curl "https://:8080/toLowerCase" \
-X POST \
-H "Content-Type: application/json" \
-d '"HELLO WORLD"'
要执行 PrimitiveFunctions.java 中定义的 double
函数,请调用此 curl 脚本。
curl "https://:8080/double" \
-X POST \
-H "Content-Type: application/json" \
-d '2'
GET 查询参数映射
对于 GET 请求,Funqy HTTP 绑定还为函数输入参数提供了查询参数映射。您的输入参数只能使用 bean 样式类和 java.util.Map
。对于 bean 样式类,查询参数名称会映射到 bean 类中的属性。这是一个简单的 Map
示例。
@Funq
public String hello(Map<String, Integer> map) {
...
}
键值必须是原始类型(char 除外)或 String
。值可以是原始类型(char 除外)、String
、OffsetDateTime
或复杂的 bean 样式类。对于上面的示例,这是相应的 curl 请求。
curl "https://:8080/a=1&b=2"
hello
函数的 map
输入参数将具有键值对:a
→1,b
→2。
Bean 样式类也可以用作输入参数类型。这是一个示例。
public class Person {
String first;
String last;
public String getFirst() { return first; }
public void setFirst(String first) { this.first = first; }
public String getLast() { return last; }
public void setLast(String last) { this.last = last; }
}
public class MyFunctions {
@Funq
public String greet(Person p) {
return "Hello " + p.getFirst() + " " + p.getLast();
}
}
属性值可以是除 char
以外的任何原始类型。它也可以是 String
和 OffsetDateTime
。OffsetDateTime
查询参数值必须是 ISO-8601 格式。
您可以使用 HTTP GET 和查询参数进行调用。
curl "https://:8080/greet?first=Bill&last=Burke"
在上面的请求中,查询参数名称会映射到输入类中的相应属性。
输入类还可以包含嵌套的 bean 类。扩展前面的示例。
public class Family {
private Person dad;
private Person mom;
public Person getDad() { return dad; }
public void setDad(Person dad) { this.dad = dad; }
public Person getMom() { return mom; }
public void setMom(Person mom) { this.mom = mom; }
}
public class MyFunctions {
@Funq
public String greet(Family family) {
...
}
}
在这种情况下,嵌套值的查询参数使用 .
表示法。例如。
curl "https://:8080/greet?dad.first=John&dad.last=Smith&mom.first=Martha&mom.last=Smith"
java.util.List
和 Set
也支持作为属性值。例如。
public class Family {
...
List<String> pets;
}
public class MyFunctions {
@Funq
public String greet(Family family) {
...
}
}
要调用 GET 请求,只需多次列出 pets
查询参数即可。
curl "https://:8080/greet?pets=itchy&pets=scratchy"
对于更复杂的类型,List
和 Set
成员在查询参数中必须有一个标识符。例如。
public class Family {
...
List<Person> kids;
}
public class MyFunctions {
@Funq
public String greet(Family family) {
...
}
}
每个 kids
查询参数都必须标识它们引用的孩子,以便运行时能够弄清楚哪些属性值属于列表中的哪些成员。这是 curl 请求。
curl "https://:8080/greet?kids.1.first=Buffy&kids.2.first=Charlie"
上面的 URL 使用值 1
和 2
来标识列表的目标成员,但可以使用任何唯一的字符串。
属性也可以是 java.util.Map
。Map 的键可以是任何原始类型和 String
。例如。
public class Family {
...
Map<String, String> address;
}
public class MyFunctions {
@Funq
public String greet(Family family) {
...
}
}
相应的调用将如下所示。
curl "https://:8080/greet?address.state=MA&address.city=Boston"
如果您的 Map
值是复杂类型,则只需继续表示法,在末尾添加要设置的属性。
public class Family {
...
Map<String, Address> addresses;
}
public class MyFunctions {
@Funq
public String greet(Family family) {
...
}
}
curl "https://:8080/greet?addresses.home.state=MA&addresses.home.city=Boston"