编辑此页面

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 目录中。

代码

如果您查看 Java 代码,您会发现没有 HTTP 特定 API。它只是用 @Funq 注释的简单 Java 方法。简单、轻松、直接。

Maven 依赖项

要编写 Funqy HTTP 函数,只需将 quarkus-funqy-http 依赖项包含到您的 Quarkus pom.xml 文件中。

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-funqy-http</artifactId>
</dependency>

构建项目

mvn clean quarkus:dev

这将在 Quarkus 开发模式下启动您的函数。

执行 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 除外)、StringOffsetDateTime 或复杂的 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 以外的任何原始类型。它也可以是 StringOffsetDateTimeOffsetDateTime 查询参数值必须是 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.ListSet 也支持作为属性值。例如。

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"

对于更复杂的类型,ListSet 成员在查询参数中必须有一个标识符。例如。

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 使用值 12 来标识列表的目标成员,但可以使用任何唯一的字符串。

属性也可以是 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"

相关内容