GET 方法不允许 fn 应用程序

Ash*_*hok 2 oracle-cloud-infrastructure fn

我是 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

谢谢。

小智 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 云基础设施中,您可以做同样的事情,但您将使用 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 
Run Code Online (Sandbox Code Playgroud)
  • 获取已发布的触发器端点:
fn list trigger <appname> 

testapp testtrigger 01E6YM3R80NG8G00GZJ000000R  http    /trig   http://localhost:8080/t/node/trig
Run Code Online (Sandbox Code Playgroud)
  • 通过其 HTTP 端点调用该函数
curl http://localhost:8080/t/node/trig
...
Run Code Online (Sandbox Code Playgroud)

在 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