全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件

函数入口定义

更新时间:2017-12-15 17:21:53

本文汇总目前函数计算支持的语言的入口函数的定义以及参数的意义,目录如下:

Nodejs

函数计算目前支持以下Nodejs运行环境:

  • Nodejs6.10 (runtime = nodejs6)

函数入口: index.handler

Handler格式为“[文件名].[函数名]”。例如创建函数时指定的Handlerindex.handler,那么函数计算会去加载index.js中定义的handler函数。

在函数计算服务使用Nodejs编程,需要定义一个Nodejs函数作为入口,一个最简单的函数定义如下:

  1. exports.handler = function(event, context, callback) {
  2. callback(null, 'hello world');
  3. };
  1. 函数名
    • exports.handler需要与创建函数时的”Handler”字段相对应:例如创建函数时指定的Handler为index.handler,那么函数计算会去加载index.js中定义的handler函数
  2. event参数
    • event参数是用户调用函数时传入的数据,其类型是Buffer
  3. context参数
    • context参数中包含一些函数的运行时信息(例如request id/临时AK等)。其类型是object,具体结构和使用在下面的nodejs guide介绍
  4. callback参数
    • callback参数用于返回调用函数的结果,其签名是function(err, data),与Nodejs中惯用的callback一样,它的第一个参数是error,第二个参数data。如果调用时err不为空,则函数将返回HandledInvocationError,否则将返回data的内容。如果data是Buffer类型则它的数据将直接被返回,如果data是object,则会将其转换成JSON字符串返回,其他类型将被转换成string返回。

Python

函数计算目前支持以下Python运行环境:

  • Python 2.7 (runtime = python2.7)
  • Python 3.6 (runtime = python3)

函数入口: main.my_handler

Handler格式为“[文件名].[函数名]”。例如创建函数时指定的Handlermain.my_handler,那么函数计算会去加载main.py中定义的my_handler函数。

在函数计算服务使用Python编程,需要定义一个Python函数作为入口,一个最简单的函数定义如下:

  1. def my_handler(event, context):
  2. return 'hello world'
  1. 函数名
    • my_handler需要与创建函数时的”Handler”字段相对应:例如创建函数时指定的Handler为main.my_handler,那么函数计算会去加载main.py中定义的my_handler函数
  2. event参数
    • event参数是用户调用函数时传入的数据,在Python2.7中是str类型,在Python3中是bytes类型
  3. context参数
    • context参数中包含一些函数的运行时信息(例如request id/临时AK等)。其类型是FCContext,具体结构和使用在下面的python guide介绍
  4. 返回值
    • 函数的返回值会作为调用函数的结果返回给用户,它可以是任意类型:对于简单类型会函数计算会把它转换成str返回,对于复杂类型会把它转换成JSON字符串返回

Java

函数计算目前支持以下Java运行环境:

  • OpenJDK 1.8.0 (runtime = java8)

函数入口: example.HelloFC::handleRequest

Handler的格式为{package}.{class}::{method}。例如包名是example,类名是HelloFC,那么创建函数时指定的Handler为example.HelloFC::handleRequest。

在函数计算服务使用Java编程,需要定义一个类并实现函数计算预定义的接口,一个最简单的函数定义如下:

  1. package example;
  2. import com.aliyun.fc.runtime.Context;
  3. import com.aliyun.fc.runtime.StreamRequestHandler;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. public class HelloFC implements StreamRequestHandler {
  8. @Override
  9. public void handleRequest(
  10. InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
  11. outputStream.write(new String("hello world").getBytes());
  12. }
  13. }
  1. 包名/类名
    • 包名和类名可以是任意的,但是需要与创建函数时的”Handler”字段相对应:上面的例子包名是”example”,类名是”HelloFC”,那么创建函数时指定的Handler为example.HelloFC::handleRequest,”Handler”的格式为{package}.{class}::{method}
  2. 实现的接口
    • 用户的代码中必须要实现函数计算预定义的接口。上面的例子中实现了StreamRequestHandler,其中的inputStream参数是调用函数时传入的数据,outputStream用于返回函数的执行结果。关于函数接口的更详细的介绍参考下面的函数接口
  3. context参数
    • context参数中包含一些函数的运行时信息(例如request id/临时AK等)。其类型是com.aliyun.fc.runtime.Context,具体结构和使用在下面的java guide介绍
  4. 返回值
    • 实现StreamRequestHandler接口的函数通过outputStream参数返回执行结果

其中用到的com.aliyun.fc.runtime这个包的依赖可以通过下面的pom.xml引用:

  1. <dependency>
  2. <groupId>com.aliyun.fc.runtime</groupId>
  3. <artifactId>fc-java-core</artifactId>
  4. <version>1.0.0</version>
  5. </dependency>

在创建函数之前,用户需要将代码和依赖的fc-java-core编译成jar包,如果使用IntelliJ IDEA,可以参考这篇文章,编译成jar包后就可以使用fcli或者控制台上传代码,以fcli为例:

  1. rockuw-MBP:hello-java (master) $ ls -lrt
  2. total 16
  3. -rw-r--r-- 1 rockuw staff 7690 Aug 31 19:45 hellofc.jar
  4. >>> mkf hello-java -t java8 -h example.HelloFC::handleRequest -d ./functions/hello-java
  5. >>> invk hello-java
  6. hello world
  7. >>>
本文导读目录