我是Fn项目的新手,使用fn init --runtime java HelloWorld-func
创建了第一个java应用程序,并尝试了一些其他场景,但遇到了GET调用问题。
- 无法进行GET调用,但POST调用工作正常。我没有对源代码进行任何更改,使用了使用fninit命令创建的默认源代码
curl-X GEThttp://localhost:8080/invoke/01EJTD2K1JNG8G00GZJ0000002{"消息":不允许的方法:GET/invoke/01EJTD2K1JNG8G00GZJ0000002"}
- 触发器的用途是什么
fn版本0.5.97
谢谢。
Fn中有两种内置的调用函数的方法
- 调用API(例如POSThttp://localhost:8080/invoke/01EJTD2K1JNG8G00GZJ0000002(
- HTTP触发器(例如GET/PUT/POST/HEADhttp://localhost:8080/t/appname/triggername)
这些服务于不同的目的:
invoke API是系统对系统的API,旨在允许软件和系统将函数作为其代码的一部分来调用-举个例子,如果您正在编写一个应用程序,希望使用函数来处理内部应用程序事件,则可以使用它。这个API有一个狭窄的约定,可以让客户端应用程序更容易地处理错误,并区分函数何时引发错误或fn服务器何时引发错误。这个API只接受POST请求,并且只返回一组有限的响应代码。
另一方面,HTTP触发器是一种内置的方式,可以直接在其自己的HTTP端点上公开函数(例如,用于服务网页或处理您定义的API(。
触发器从客户端接收原始HTTP请求(可以有任何动词,如PUT/POST/HEAD和任何HTTP头(,并将请求封装在对底层函数的调用中,然后底层函数可以提取有关请求的信息并生成HTTP响应。在Oracle云基础架构中,您可以做同样的事情,但您将使用API网关而不是触发器来接收传入请求(请参见下文(。
在内部,您可以将触发器视为调用端点之上的一层,它将HTTP请求封装到调用API上的调用中,使用封装的请求调用函数,然后将函数中的HTTP响应信息解包回HTTP请求。
因此,invoke API与触发器或API网关之间的关键区别在于,在invoke APIFn上定义API(以使在Fn上更容易构建软件(,但在触发器上,您定义API-您可以捕获完整的请求并定义完整的HTTP响应。
在Fn中,如果您想公开由处理GET并返回网页的函数实现的REST API,您可以:
- 创建一个函数。如果您希望该函数从传入请求中读取和写入HTTP信息,您可以使用FDK库来读取客户端设置的封装HTTP请求(每个FDK都支持此功能(例如nodeJS:https://github.com/fnproject/fdk-node#using-http标头和设置http状态代码python:https://github.com/fnproject/fdk-python#handling-http函数java:中的http元数据https://github.com/fnproject/fdk-java/blob/master/docs/HTTPGatewayFunctions.md(
- 部署功能(
fn deploy ...
( - 创建一个触发器,将该函数绑定到http端点
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云基础架构中,您可以通过创建一个将函数绑定到HTTP端点的API网关来做同样的事情。这里记录了如何做到这一点的一个例子:
https://blogs.oracle.com/developers/creating-your-first-api-gateway-in-the-oracle-cloudhttps://blogs.oracle.com/developers/working-with-http-in-oracle-functions-using-the-fn-project-python-fdk