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