先看下整个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打包容易丢失依赖(须要专门配置插件才能解决此问题,我目前不会这个,会的能够留言交流下,谢谢)