函數計算+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打包容易丟失依賴(須要專門配置插件才能解決此問題,我目前不會這個,會的能夠留言交流下,謝謝)

相關文章
相關標籤/搜索