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

AWS Lambda Function URLs Java接收JSON输入遇JSON解析异常

解决AWS Lambda Function URL POST请求JSON解析异常

问题原因

当使用AWS Lambda Function URL触发函数时,Lambda默认会将POST请求封装为APIGatewayV2HTTPEvent格式的JSON对象传递给函数,但你的代码声明输入类型为Map<String, String>、输出类型为String,这会导致:

  1. Lambda尝试将复杂的APIGatewayV2HTTPEvent对象反序列化为Map<String, String>,触发类型不匹配的反序列化错误;
  2. 返回的String会被Lambda当作JSON进行解析,若返回内容不是合法JSON格式,也会引发后续解析问题。

解决方案

方案1:适配Function URL的事件格式(推荐)

修改函数的输入输出类型为Function URL专用的事件类,同时正确处理请求体和响应格式:

  1. 添加依赖
    在项目构建文件中引入aws-lambda-java-events依赖(以Maven为例):
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-events</artifactId>
    <version>3.11.0</version> <!-- 使用最新稳定版本 -->
</dependency>
  1. 修改Lambda代码
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayV2HTTPEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayV2HTTPResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.Map;

public class PiiDecryptionLambda implements RequestHandler<APIGatewayV2HTTPEvent, APIGatewayV2HTTPResponse> {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public APIGatewayV2HTTPResponse handleRequest(APIGatewayV2HTTPEvent request, Context context) {
        try {
            // 解析POST请求体为Map
            Map<String, String> requestData = objectMapper.readValue(request.getBody(), Map.class);
            context.getLogger().log("inside the lambda and the data is :" + requestData);

            // 构造标准HTTP响应
            APIGatewayV2HTTPResponse response = new APIGatewayV2HTTPResponse();
            response.setStatusCode(200);
            
            // 设置响应头为JSON格式
            Map<String, String> headers = new HashMap<>();
            headers.put("Content-Type", "application/json");
            response.setHeaders(headers);
            
            // 返回JSON格式的响应内容
            response.setBody(objectMapper.writeValueAsString(Map.of("name", requestData.get("name"))));
            return response;
        } catch (Exception e) {
            context.getLogger().log("Error processing request: " + e.getMessage());
            // 构造错误响应
            APIGatewayV2HTTPResponse errorResponse = new APIGatewayV2HTTPResponse();
            errorResponse.setStatusCode(500);
            errorResponse.setBody("{\"error\": \"Failed to process request\"}");
            return errorResponse;
        }
    }
}

方案2:配置Function URL为RAW负载格式

如果不想修改代码,可以将Function URL的有效负载格式改为RAW,让Lambda直接接收原始请求体:

  1. 进入AWS Lambda控制台,找到目标函数;
  2. 切换到配置标签页,选择函数URL;
  3. 点击编辑,在有效负载格式下拉框中选择RAW,保存更改。

此时需要确保:

  • POST请求的Content-Type为application/json;
  • 请求体是合法的JSON对象(例如{"name": "test"});
  • 函数返回的String是合法JSON格式(例如返回"{\"name\":\"" + requestData.get("name") + "\"}"),或者修改返回类型为Map,让Lambda自动序列化为JSON。

验证步骤

  1. 重新部署修改后的Lambda函数;
  2. 发送POST请求,确保请求头包含Content-Type: application/json,请求体为合法JSON对象;
  3. 查看Lambda日志,确认请求数据正常解析,响应返回正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:25:00