函数计算+java:两种函数计算的入口编写

先看下整个demo的结构java

首先须要添加函数计算的相关依赖 pom.xmlapi

<dependency>
    <groupId>com.aliyun.fc.runtime</groupId>
    <artifactId>fc-java-core</artifactId>
    <version>1.2.0</version>
</dependency>

入参格式:app

{
    "path":"api request path",
    "httpMethod":"request method name",
    "headers":{"username":"zhangsan", "password":"1234"},
    "queryParameters":{"k1":"v1"},
    "pathParameters":{"k2":"v2"},
    "body":"{\"k3\": \"v3\"}",
    "isBase64Encoded":true
}

一、PojoRequestHandler类型入口的函数计算代码ide

定义Request和Response的格式:函数

import java.util.Map;
public class ApiRequest {
    private String path;
    private String httpMethod;
    private Map headers;
    private Map queryParameters;
    private Map pathParameters;
    private String body;
    private boolean isBase64Encoded;
    @Override
    public String toString() {
        return "Request{" +
                "path='" + path + '\'' +
                ", httpMethod='" + httpMethod + '\'' +
                ", headers=" + headers +
                ", queryParameters=" + queryParameters +
                ", pathParameters=" + pathParameters +
                ", body='" + body + '\'' +
                ", isBase64Encoded=" + isBase64Encoded +
                '}';
    }
    ...
    getter和setter省略
    ...
}
import java.util.Map;
public class ApiResponse {
    private Map headers;
    private boolean isBase64Encoded;
    private int statusCode;
    private String body;
    public ApiResponse(Map headers, boolean isBase64Encoded, int statusCode, String body) {
        this.headers = headers;
        this.isBase64Encoded = isBase64Encoded;
        this.statusCode = statusCode;
        this.body = body;
    }
    ...
    getter和setter省略
    ...
}

编写函数入口:工具

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.PojoRequestHandler;
import myfc.utils.ApiRequest;
import myfc.utils.ApiResponse;
import java.util.HashMap;
import java.util.Map;
public class ApiTriggerDemo implements PojoRequestHandler<ApiRequest, ApiResponse> {
    public ApiResponse handleRequest(ApiRequest request, Context context) {
        // Get ApiRequest info
        context.getLogger().info(request.toString());
        context.getLogger().info("path:" + request.getPath());
        context.getLogger().info("httpMethod:" + request.getHttpMethod());
        context.getLogger().info("headers:" + request.getHeaders());
        context.getLogger().info("queryParameters:" + request.getQueryParameters());
        context.getLogger().info("pathParameters:" + request.getPathParameters());
        context.getLogger().info("body:" + request.getBody());

        // ApiResponse example
        Map headers = new HashMap();
        headers.put("responseCode","200");
        headers.put("responseMsg","返回信息");
        boolean isBase64Encoded = false;
        int statusCode = 200;
        String returnBody = "我是returnBody";
        return new ApiResponse(headers,isBase64Encoded,statusCode,returnBody);
    }
}

二、StreamRequestHandler类型入口的函数计算代码this

定义Request和Response的格式google

import java.util.Map;
public class ApiReq {
    private String path;
    private String httpMethod;
    private Map headers;
    private Map queryParameters;
    private Map pathParameters;
    private String body;
    private boolean isBase64Encoded;

    @Override
    public String toString() {
        return "Request{" +
                "path='" + path + '\'' +
                ", httpMethod='" + httpMethod + '\'' +
                ", headers=" + headers +
                ", queryParameters=" + queryParameters +
                ", pathParameters=" + pathParameters +
                ", body='" + body + '\'' +
                ", isBase64Encoded=" + isBase64Encoded +
                '}';
    }
    ...
    getter和setter省略
    ...
}
import java.util.Map;
public class ApiResp {
    private Map headers;
    private boolean isBase64Encoded;
    private int statusCode;
    private Map body;

    public ApiResp(Map headers, boolean isBase64Encoded, int statusCode, Map body) {
        this.headers = headers;
        this.isBase64Encoded = isBase64Encoded;
        this.statusCode = statusCode;
        this.body = body;
    }
    ...
    getter和setter省略
    ...
}

由于传入的是流,须要将流转化成Json字符串,再转换成Java对象。这里使用Gson工具来作转换(Jackson工具应该也是能够的),须要先添加依赖阿里云

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
    <scope>compile</scope>
</dependency>

编写函数入口:插件

import com.aliyun.fc.runtime.Context;
import com.aliyun.fc.runtime.StreamRequestHandler;
import myfc.utils.ApiReq;
import myfc.utils.ApiResp;
import com.google.gson.Gson;
import java.io.*;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class ApiTriggerDemo2 implements StreamRequestHandler {
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
        try {
            // Convert InputStream to string
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuffer stringBuffer = new StringBuffer();
            String string = "";
            while ((string = bufferedReader.readLine()) != null) {
                stringBuffer.append(string);
            }
            String input = stringBuffer.toString();
            context.getLogger().info("inputStream: " + input);

            context.getLogger().info(Gson.class.toString());
            context.getLogger().info(ApiReq.class.toString());

            ApiReq req = new Gson().fromJson(input, ApiReq.class);
            context.getLogger().info("input req: ");
            context.getLogger().info(req.toString());
            String bodyReq = req.getBody();
            context.getLogger().info("body: " + bodyReq);

            // construct response
            Map headers = new HashMap();
            boolean isBase64Encoded = false;
            int statusCode = 200;
            Map body = new HashMap();
            body.put("retMsg", "返回参数");
            ApiResp resp = new ApiResp(headers, isBase64Encoded, statusCode, body);
            String respJson = new Gson().toJson(resp);
            context.getLogger().info("outputStream: " + respJson);
            outputStream.write(respJson.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

编写完成后打包成Jar包上传阿里云便可。此处推荐使用IDEA或者Eclipse打包,使用Maven打包容易丢失依赖(须要专门配置插件才能解决此问题,我目前不会这个,会的能够留言交流下,谢谢)

相关文章
相关标签/搜索