請求處理程序(Handler)
更新時間 2025-10-16 09:28:50
最近更新時間: 2025-10-16 09:28:50
分享文章
本文介紹如何使用Java請求處理程序響應接收到的事件并執行相應的業務邏輯。
請求處理程序
請求處理程序是您提供的一個方法。當您的函數被調用時,函數計算會運行該方法處理請求。
您可以通過函數計算控制臺頁面配置請求處理程序,對于Java語言的函數,請求處理程序需配置為 [包名].[類名]::[方法名]。例如,您的包名為example,類型為App,方法名為handleRequest,則請求處理程序可配置為 example.App::handleRequest。
處理程序接口
您在使用Java編程時,必須要實現函數計算提供的接口類,庫為請求處理程序定義了以下接口。
- 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 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;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import com.ctg.faas.runtime.Context;
import com.ctg.faas.runtime.HttpRequestHandler;
import example.util.ServletUtil;
public class HttpApp implements HttpRequestHandler {
private static final Logger logger = Logger.getLogger(HttpApp.class.getName());
private static final ObjectMapper objectMapper = new ObjectMapper();
@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);
// 使用Jackson替代FastJSON
java.util.Map<String, Object> jsonMap = objectMapper.readValue(body,
new TypeReference<java.util.Map<String, Object>>() {});
context.getLogger().info("body:" + jsonMap.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();
}
}