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

Nodejs

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

  • Nodejs 6(runtime = Nodejs6)
  • Nodejs 8(runtime = Nodejs8)

函数入口: index.handler

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

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

exports.handler = function(event, context, callback) {
  callback(null, 'hello world');
};        
说明 如果您的函数设置了 HTTP 触发器,函数接口定义将不同。详细信息请参考 Nodejs 函数接口
  • 函数名

    exports.handler需要与创建函数时的“Handler”字段相对应:例如创建函数时指定的Handler为index.handler,那么函数计算会去加载index.js中定义的handler函数。

  • event 参数

    event 参数是调用函数时传入的数据,其类型是 Buffer

  • context 参数

    context 参数中包含一些函数的运行时信息(例如 request id / 临时 AK 等)。其类型是 object,具体结构和使用在下面的 Node.js 运行环境 介绍。

  • 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 函数作为入口,一个最简单的函数定义如下:

def my_handler(event, context):
    return 'hello world'          
说明 如果您的函数设置了 HTTP 触发器,函数接口定义将不同。详细信息请参考 Python HTTP 函数
  • 函数名

    my_handler 需要与创建函数时的 "Handler" 字段相对应:例如创建函数时指定的 Handler 为 main.my_handler ,那么函数计算会去加载 main.py 中定义的 my_handler 函数。

  • event 参数

    event 参数是调用函数时传入的数据,在 Python2.7 中是 str 类型,在 Python3 中是 bytes 类型。

  • context 参数

    context 参数中包含一些函数的运行时信息(例如 request id / 临时 AK 等)。其类型是 FCContext,具体结构和使用在下面的 Python 运行环境 介绍。

  • 返回值

    函数的返回值会作为调用函数的结果返回给用户,它可以是任意类型:对于简单类型会函数计算会把它转换成 str 返回,对于复杂类型会把它转换成 JSON 字符串返回。

Java

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

OpenJDK 1.8.0(runtime = java8)

函数入口: example.HelloFC::handleRequest

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

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

package example;

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.StreamRequestHandler;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class HelloFC implements StreamRequestHandler {

    @Override
    public void handleRequest(
            InputStream inputStream, OutputStream outputStream, Context context) throws IOException {

        outputStream.write(new String("hello world").getBytes());
    }
}            
  • 包名/类名

    包名和类名可以是任意的,但是需要与创建函数时的 "Handler" 字段相对应:上面的例子包名是 "example",类名是 "HelloFC",那么创建函数时指定的 Handler为 example.HelloFC::handleRequest,"Handler" 的格式为 {package}.{class}::{method}

  • 实现的接口

    用户的代码中必须要实现函数计算预定义的接口。上面的例子中实现了 StreamRequestHandler,其中的 inputStream 参数是调用函数时传入的数据,outputStream 用于返回函数的执行结果。

  • context 参数

    context 参数中包含一些函数的运行时信息(例如 request id / 临时 AK 等)。其类型是 com.aliyun.fc.runtime.Context,具体结构和使用在下面的 Java 运行环境介绍。

  • 返回值

    实现 StreamRequestHandler 接口的函数通过 outputStream 参数返回执行结果。

    其中用到的 com.aliyun.fc.runtime 这个包的依赖可以通过 Maven 进行方便的管理。上述依赖包可以通过下面的 pom.xml 引用:

    <dependencies>
        ...
        <dependency>
            <groupId>com.aliyun.fc.runtime</groupId>
            <artifactId>fc-java-core</artifactId>
            <version>1.0.0</version>
        </dependency>
        ...
    </dependencies>
    
    <!--另外需要注意,Maven 的编译 JDK 版本号-->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.source>
    </properties>            

    在创建函数之前,用户需要将代码和依赖的 fc-java-core 编译成 jar 包。在 Maven 环境下,只需要执行

    mvn clean install            

    即可在工程的 target 目录下生成名为 <artifactID>-<version>.jar 的 jar 包。如果使用 IntelliJ IDEA,可以参考 这篇文章,也可以使用 IDEA 的 Maven 插件直接 install,编译成 jar 包后就可以使用 fcli 或者控制台上传代码,以 fcli 为例:

    $ ls -lrt
    total 16
    -rw-r--r--  1 aliyun  aliyun  7690 Aug 31 19:45 hello-java-1.0-SNAPSHOT.jar
    
    >>> mkf hello-java -t java8 -h example.HelloFC::handleRequest -f ./hello-java-1.0-SNAPSHOT.jar
    >>> invk hello-java
    hello world
    >>>