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

通过AWS API Gateway向Java Lambda解析JSON请求体的最佳实践

最佳实践:API Gateway + Java Lambda 解析JSON请求体

一、先搞定API Gateway的核心配置

要让请求体顺利到Lambda,核心是选对集成方式:

  • 优先用Lambda代理集成:这是最省心的方式,API Gateway会自动把整个请求(包括请求体、请求头、URL参数等)打包成标准的APIGatewayProxyRequestEvent结构传给Lambda,不需要额外写映射模板。
  • 如果用非代理集成:必须在集成请求的映射模板里(针对application/json类型)写$input.json('$'),这样就能把原始请求体直接透传给Lambda,而不是默认的请求上下文结构。

二、Java Lambda的两种解析方案

1. 推荐:用POJO自动解析(最简洁)

如果用了代理集成,直接用AWS提供的APIGatewayProxyRequestEvent作为输入参数,从中提取请求体再反序列化成业务对象:

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

// 你的业务请求体POJO(必须有默认构造器和getter/setter)
class UserRequest {
    private String name;
    private int age;
    public UserRequest() {}
    // getter、setter省略
}

public class LambdaHandler implements RequestHandler<APIGatewayProxyRequestEvent, String> {
    @Override
    public String handleRequest(APIGatewayProxyRequestEvent input, Context context) {
        try {
            // 从代理事件中拿到原始请求体字符串
            String requestBody = input.getBody();
            // 用Jackson反序列化成业务对象
            UserRequest userReq = new ObjectMapper().readValue(requestBody, UserRequest.class);
            return "处理完成:欢迎" + userReq.getName();
        } catch (Exception e) {
            return "解析失败:" + e.getMessage();
        }
    }
}

如果是用非代理集成且配置了$input.json('$')透传,Lambda的输入可以直接是你的业务POJO,省掉提取body的步骤:

public class LambdaHandler implements RequestHandler<UserRequest, String> {
    @Override
    public String handleRequest(UserRequest input, Context context) {
        return "直接拿到解析后的对象:欢迎" + input.getName();
    }
}

2. 手动用InputStream解析(兼容特殊场景)

如果没法用POJO或者需要更底层的控制,可以用RequestStreamHandler直接读取输入流:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import java.io.*;
import com.fasterxml.jackson.databind.ObjectMapper;

public class StreamLambdaHandler implements RequestStreamHandler {
    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            String requestBody = sb.toString();
            // 解析成业务对象
            UserRequest userReq = new ObjectMapper().readValue(requestBody, UserRequest.class);
            // 输出结果
            outputStream.write(("处理结果:" + userReq.getName()).getBytes());
        } catch (Exception e) {
            try {
                outputStream.write(("错误:" + e.getMessage()).getBytes());
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

三、排查curl请求失败的常见坑

  • 一定要加Content-Type: application/json请求头,否则API Gateway不会正确识别请求体:
    curl -X POST https://你的API网关地址/路径 \
    -H "Content-Type: application/json" \
    -d '{"name":"张三", "age":25}'
    
  • 如果你之前测试Lambda时直接传的是业务JSON,而实际用代理集成时Lambda收到的是包装后的APIGatewayProxyRequestEvent,代码逻辑要对应调整,别拿错字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:20:08