请求处理程序
请求处理程序是您提供的一个方法。当您的函数被调用时,函数计算会运行该方法处理请求。
您可以通过函数计算控制台页面配置请求处理程序,对于Java语言的函数,请求处理程序需配置为 [包名].[类名]::[方法名]
。例如,您的包名为example,类型为App,方法名为handleRequest,则请求处理程序可配置为 example.App::handleRequest
。
处理程序接口
您在使用Java编程时,必须要实现函数计算提供的接口类,c-runtime-core库为请求处理程序定义了以下接口。
- StreamRequestHandler
以流的方式接收输入的事件请求对象并返回执行结果。您需要从输入流中读取调用函数时的输入,处理完成后把函数执行结果写到输出流中来返回。 - PojoRequestHandler
以泛型的方式接收输入的事件请求对象并返回执行结果。您可以自定义输入和输出的类型,但是输入和输出的类型必须是POJO类型。 - HttpRequestHandler
以标准的Servlet协议方式接收HTTP触发器的请求并响应执行结果。请求会封装成HttpServletRequest
对象,并通过HttpServletResponse
对象来返回响应头和响应体。
示例:StreamRequestHandler
一个最简单的StreamRequestHandler示例如下所示:
package example;
import com.ctg.faas.runtime.*;
import example.util.ServletUtil;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class StreamHandler implements StreamRequestHandler {
@Override
public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
FunctionComputeLogger logger = context.getLogger();
logger.info("StreamRequestHandler hello");
String inStr = ServletUtil.getInputString(input);
logger.info("input :"+inStr);
String req = String.format("input: %s\n", inStr);
output.write(req.getBytes());
output.flush();
output.close();
}
}
-
包名和类名
包名和类名可以自定义。 -
实现的接口
您的代码中必须要实现函数计算预定义的接口。上述的代码示例中实现了StreamRequestHandler
,其中的input参数为调用函数时传入的数据,output参数用于返回函数的执行结果。 -
Context参数
Context参数中包含一些函数的运行时信息(例如RequestId、临时AccessKey等),其类型是com.ctg.faas.runtime.Context
。 -
返回值
实现StreamRequestHandler
接口的函数通过output参数返回执行结果。 -
引入的依赖
其中用到的com.ctg.faas.runtime
包的maven依赖坐标如下:<dependency> <groupId>com.ctg.faas.runtime</groupId> <artifactId>fc-runtime-core</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency>
示例:PojoRequestHandler
一个最简单的PojoRequestHandler示例如下所示:
// -------- PojoHandler.java --------
package example;
import com.ctg.faas.runtime.Context;
import com.ctg.faas.runtime.PojoRequestHandler;
import example.model.SimpleRequest;
import example.model.SimpleResponse;
public class PojoHandler implements PojoRequestHandler<SimpleRequest, SimpleResponse> {
@Override
public SimpleResponse handleRequest(SimpleRequest request, Context context) {
String message = "Hello, I am " + request.getFirstName() + " " + request.getLastName();
return new SimpleResponse(message);
}
}
// -------- SimpleRequest.java --------
package example.model;
public class SimpleRequest {
String firstName;
String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public SimpleRequest() {}
public SimpleRequest(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
// -------- SimpleResponse.java --------
package example.model;
public class SimpleResponse {
String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public SimpleResponse() {}
public SimpleResponse(String message) {
this.message = message;
}
}
示例:使用HTTP触发器调用HTTP函数
package example;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ctg.faas.runtime.Context;
import com.ctg.faas.runtime.HttpRequestHandler;
import example.util.ServletUtil;
import java.io.IOException;
import java.io.OutputStream;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HttpApp implements HttpRequestHandler {
private static final Logger logger = Logger.getLogger(HttpApp.class.getName());
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response, Context context)
throws IOException, ServletException {
String requestPath = (String) request.getAttribute("FC_REQUEST_PATH");
String requestURI = (String) request.getAttribute("FC_REQUEST_URI");
String requestClientIP = (String) request.getAttribute("FC_REQUEST_CLIENT_IP");
response.setStatus(200);
response.setHeader("header1", "value1");
response.setHeader("header2", "value2");
response.setHeader("Content-Type", "text/plain");
context.getLogger().info("hello");
logger.info("loger hello");
String body = ServletUtil.getBodyData(request);
JSONObject json = JSON.parseObject(body);
context.getLogger().info("body:"+json.toString());
String req = String.format("Path: %s\n Uri: %s\n IP: %s\n", requestPath, requestURI, requestClientIP);
OutputStream out = response.getOutputStream();
out.write((req).getBytes());
out.flush();
out.close();
}
}