GET 方法不允许 fn 应用程序

GET method not allowed to fn applications

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

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

curl -X GET http://localhost:8080/invoke/01EJTD2K1JNG8G00GZJ0000002 {"message":"Method not allowed: GET /invoke/01EJTD2K1JNG8G00GZJ0000002"}

  1. 触发器有什么用?

fn 版本 0.5.97

谢谢。

在 Fn 中有两种 built-in 调用函数的方法

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

它们有不同的用途:

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

另一方面,HTTP 触发器是一种 built-in 方法,可以直接在它们自己的 HTTP 端点上公开函数(例如,用于提供网页,或处理您定义的 API)。

触发器从客户端获取原始 HTTP 请求(可以有任何动词,如 PUT/POST/HEAD 和任何 HTTP headers)并将请求包装在对底层函数的调用中,然后可以提取有关请求的信息并生成 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 中,您可以通过创建一个 API 将函数绑定到 HTTP 端点的网关来做同样的事情。此处记录了如何执行此操作的示例:

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