2

我是 Fn 项目的新手,使用 java 创建了第一个应用程序fn init --runtime java HelloWorld-func并尝试了一些其他场景,但遇到了 GET 调用问题。

  1. 无法进行 GET 调用,但 POST 调用工作正常。我没有对源代码进行任何更改,使用的是使用 fn init 命令创建的默认代码。

curl -X GET http://localhost:8080/invoke/01EJTD2K1JNG8G00GZJ0000002 {"message":"方法不允许:GET /invoke/01EJTD2K1JNG8G00GZJ0000002"}

  1. 触发器有什么用?

fn 版本 0.5.97

谢谢。

4

1 回答 1

5

在 Fn 中有两种调用函数的内置方式

  • 调用 API(例如 POST http://localhost:8080/invoke/01EJTD2K1JNG8G00GZJ0000002 )
  • HTTP 触发器(例如 GET/PUT/POST/HEAD http://localhost:8080/t/appname/triggername)

它们有不同的用途:

调用 API 是系统到系统的 API,旨在允许软件和系统调用函数作为其代码的一部分 - 举个例子,如果您正在编写一个想要使用函数来处理内部应用程序事件的应用程序,您可能会使用它。这个 API 有一个狭窄的契约,使客户端应用程序更容易处理错误并区分函数何时引发错误或 fn 服务器引发错误。此 API 仅接受 POST 请求,并且仅返回一组有限的响应代码。

另一方面,HTTP 触发器是一种直接在其自己的 HTTP 端点上公开函数的内置方式(例如,用于提供网页,或处理您定义的 API)。

触发器从客户端获取原始 HTTP 请求(可以具有任何动词,如 PUT/POST/HEAD 和任何 HTTP 标头)并将请求包装在对底层函数的调用中,然后该函数可以提取有关请求的信息并生成 HTTP 响应. 在 Oracle Cloud Infrastructure 中,您可以执行相同的操作,但您将使用 API 网关而不是触发器来接收传入请求(见下文)。

在内部,您可以将触发器视为调用端点之上的一个层,它将 HTTP 请求包装到调用 API 上的调用中,使用包装的请求调用函数,然后将来自函数的 HTTP 响应信息解包回 HTTP 请求。

因此,调用 API 和触发器或 API 网关之间的主要区别在于,在调用 API Fn上定义了 API(以便更容易在 Fn 之上构建软件),但在触发器上定义 API - 您可以捕获完整的请求并定义完整的 HTTP 响应。

在 Fn 中,如果您想公开由处理 GET 并返回网页的函数实现的 REST API,您可以:

   fn create trigger <appname> <funcname> <triggername>  --type http  --source http 
  • 获取发布的触发器端点:
fn list trigger <appname> 

testapp testtrigger 01E6YM3R80NG8G00GZJ000000R  http    /trig   http://localhost:8080/t/node/trig
  • 通过其 HTTP 端点调用该函数
curl http://localhost:8080/t/node/trig
...

在 Oracle Cloud Infrastructure 中,您可以通过创建将函数绑定到 HTTP 端点的 API 网关来执行相同的操作。此处记录了如何执行此操作的示例:

https://blogs.oracle.com/developers/creating-your-first-api-gateway-in-the-oracle-cloud https://blogs.oracle.com/developers/working-with-http-in-oracle -functions-using-the-fn-project-python-fdk

于 2020-09-23T10:28:38.063 回答