You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS POST API对接Java Lambda无法接收参数报内部服务器错误求助

问题根源

Lambda控制台测试时,你直接传入了CompanyRecord格式的JSON,Lambda可以直接反序列化;但通过API Gateway调用时,Lambda收到的是API Gateway封装的标准请求事件,而非直接的业务参数结构。这个事件包含body、queryStringParameters、headers等字段,你的代码无法直接解析为CompanyRecord,导致反序列化失败,触发Internal server error。

API Gateway传入Lambda的典型事件结构示例:

{
  "httpMethod": "POST",
  "queryStringParameters": {"userID": "5", "name": "test"},
  "body": "{\"userID\":10,\"name\":\"test\"}",
  "headers": {...},
  "resource": "/your-endpoint"
}
解决方案

根据你传递参数的方式,选择对应的代码修改:

场景1:处理POST请求体的JSON参数

如果是通过请求体传递{"userID":10,"name":"test"},需要先接收API Gateway的请求对象,再解析body字段:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Launcher implements RequestHandler<ApiGatewayRequest, String> {
    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public String handleRequest(ApiGatewayRequest request, Context context) {
        try {
            // 把请求体的JSON字符串解析为CompanyRecord
            CompanyRecord record = objectMapper.readValue(request.body(), CompanyRecord.class);
            return String.valueOf(record.userID()) + record.name();
        } catch (Exception e) {
            context.getLogger().log("解析请求失败: " + e.getMessage());
            throw new RuntimeException("无效的请求体格式");
        }
    }

    // 定义API Gateway请求的结构(只包含需要的body字段)
    record ApiGatewayRequest(String body) {}

    record CompanyRecord(int userID, String name) {}
}

场景2:处理查询字符串参数

如果是通过userID=5&name=test传递参数,需要读取queryStringParameters字段:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import java.util.Map;

public class Launcher implements RequestHandler<ApiGatewayRequest, String> {

    @Override
    public String handleRequest(ApiGatewayRequest request, Context context) {
        Map<String, String> queryParams = request.queryStringParameters();
        // 校验必填参数
        if (queryParams == null || !queryParams.containsKey("userID") || !queryParams.containsKey("name")) {
            throw new RuntimeException("缺少必填查询参数");
        }
        // 转换参数类型并返回结果
        int userID = Integer.parseInt(queryParams.get("userID"));
        String name = queryParams.get("name");
        return String.valueOf(userID) + name;
    }

    // 定义API Gateway请求的结构(只包含需要的查询参数字段)
    record ApiGatewayRequest(Map<String, String> queryStringParameters) {}

    record CompanyRecord(int userID, String name) {}
}
关键注意事项
  • API Gateway集成设置:确保使用Lambda Proxy Integration(默认配置),这样API Gateway会把完整的请求结构传给Lambda,无需手动配置参数映射。
  • 依赖配置:如果用Jackson解析JSON,需在构建文件中添加依赖(比如Maven的com.fasterxml.jackson.core:jackson-databind:2.15.2)。
  • 日志排查:出现错误时,去CloudWatch Logs查看Lambda的具体异常日志,能快速定位问题(比如参数类型转换失败、JSON格式错误)。

内容的提问来源于stack exchange,提问作者boundliss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:34:54