基于AWS Lambda的Spring Boot REST API(GET/POST)改造及多JSON输入POST请求测试运行方案咨询
我之前刚好完成过Spring Boot应用迁移到AWS Lambda并处理多JSON POST请求的任务,给你分享一步步的实操方案,应该能解决你的问题:
一、先搞定依赖配置
首先在你的Spring Boot项目里添加Lambda适配的必要依赖(以Maven为例,Gradle可以对应调整):
spring-boot-starter-aws-lambda:Spring官方提供的Lambda适配启动器,帮你整合Spring上下文和Lambda运行环境aws-lambda-java-events:用来解析API Gateway转发过来的请求事件(你的POST请求都是通过API Gateway路由到Lambda的)
<dependencies> <!-- 其他Spring Boot依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aws-lambda</artifactId> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.11.1</version> <!-- 用最新稳定版即可 --> </dependency> </dependencies>
二、编写Lambda Handler处理JSON POST请求
Lambda接收的是API Gateway传递的APIGatewayProxyRequestEvent对象,里面包含了请求的JSON body、请求路径、headers等信息。你需要把body反序列化成业务DTO,处理完再返回标准化的响应。
举个实际的示例:
import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.stereotype.Component; @Component public class PostRequestHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> { private final OrderService orderService; // 你的业务服务类 private final ObjectMapper objectMapper; // 构造注入Spring管理的Bean public PostRequestHandler(OrderService orderService, ObjectMapper objectMapper) { this.orderService = orderService; this.objectMapper = objectMapper; } @Override public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) { APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent(); try { // 解析JSON请求body到业务DTO CreateOrderRequest requestDto = objectMapper.readValue(input.getBody(), CreateOrderRequest.class); // 调用业务逻辑处理 OrderResponse responseDto = orderService.createOrder(requestDto); // 封装成功响应 String responseBody = objectMapper.writeValueAsString(responseDto); response.setStatusCode(200); response.setBody(responseBody); // 跨域header(如果前端需要调用的话) response.addHeader("Access-Control-Allow-Origin", "*"); } catch (Exception e) { // 打印错误日志到CloudWatch context.getLogger().log("处理POST请求出错: " + e.getMessage()); // 封装错误响应 response.setStatusCode(500); response.setBody("{\"error\": \"请求处理失败,请稍后重试\"}"); } return response; } }
三、本地测试Lambda函数
本地测试有两种高效方式,覆盖单元测试和集成测试场景:
方式一:JUnit单元测试
模拟API Gateway请求事件,直接调用handler验证逻辑:import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class PostRequestHandlerTest { private final OrderService mockOrderService = new OrderService(); // 也可以用MockBean模拟 private final ObjectMapper objectMapper = new ObjectMapper(); private final PostRequestHandler handler = new PostRequestHandler(mockOrderService, objectMapper); @Test void testCreateOrderRequest() throws Exception { // 构造测试JSON请求 String requestBody = "{\"userId\": \"123\", \"productId\": \"456\", \"quantity\": 2}"; APIGatewayProxyRequestEvent input = new APIGatewayProxyRequestEvent(); input.setBody(requestBody); // 执行handler APIGatewayProxyResponseEvent response = handler.handleRequest(input, null); // 验证结果 assertEquals(200, response.getStatusCode()); // 可进一步解析响应body验证业务返回值 } }方式二:AWS SAM CLI本地运行
模拟线上API Gateway+Lambda的运行环境,直接用Postman/curl测试:- 打包项目:
mvn package生成JAR包 - 编写
template.yaml配置SAM:AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: CreateOrderFunction: Type: AWS::Serverless::Function Properties: Handler: com.yourpackage.PostRequestHandler::handleRequest Runtime: java17 # 对应你的JDK版本 CodeUri: target/your-spring-boot-app.jar Events: CreateOrderApi: Type: Api Properties: Path: /orders/create Method: post - 启动本地API网关:
sam local start-api - 发送测试请求:
curl -X POST http://localhost:3000/orders/create -H "Content-Type: application/json" -d '{"userId": "123", "productId": "456", "quantity": 2}'
- 打包项目:
四、部署到AWS Lambda并配置多POST路由
部署Lambda函数:
- 打包项目:
mvn package - 登录AWS控制台,创建Lambda函数,选择“上传.zip或JAR文件”,上传生成的JAR包
- 在Lambda配置里设置Handler为你的类全路径,比如
com.yourpackage.PostRequestHandler::handleRequest
- 打包项目:
配置多POST请求路由:
如果有多个POST端点(比如/orders/create、/orders/update),有两种方案:- 方案一:单Lambda处理所有请求:在handler里通过
input.getPath()判断请求路径,分发给不同的业务逻辑 - 方案二:多Lambda分别处理:为每个端点创建独立的Handler类,在API Gateway里分别配置路径到对应的Lambda函数
- 方案一:单Lambda处理所有请求:在handler里通过
五、线上调试技巧
- 查看Lambda日志:到AWS CloudWatch控制台找到对应的Log Group,里面会打印你在handler里输出的日志,方便定位问题
- 控制台测试:在Lambda控制台的“测试”标签,选择“API Gateway Proxy”模板,修改body为你的JSON,直接测试执行
- API Gateway测试:部署API后,用Postman调用API Gateway的公网URL,测试真实请求链路
内容的提问来源于stack exchange,提问作者Invoice Testing
相关产品推荐
相关产品推荐

