如何在Java AWS Lambda中获取API Gateway调用URL及传递数组参数?
嘿,刚好之前在项目里踩过这两个坑,来给你分享下实际可用的解决方案:
如何获取API Gateway的源请求URL
在Lambda代理集成的输入对象里,虽然没有直接给出完整的源URL,但可以通过几个内置字段拼接出来:
requestContext.domainName:你的API Gateway域名(比如xxxx.execute-api.us-east-1.amazonaws.com)requestContext.path:请求的完整路径(包含阶段名,比如/prod/your-endpoint)queryStringParameters:请求的查询参数键值对(如果有的话)- (可选)
requestContext.stage:单独获取API的部署阶段(比如prod)
给你个Java代码示例,用来拼接完整URL:
import java.util.Map; public class LambdaHandler { public String handleRequest(Map<String, Object> input, Context context) { // 从输入中提取必要字段 Map<String, Object> requestContext = (Map<String, Object>) input.get("requestContext"); String domainName = (String) requestContext.get("domainName"); String path = (String) requestContext.get("path"); Map<String, String> queryParams = (Map<String, String>) input.get("queryStringParameters"); // 拼接基础URL(如果是HTTP协议就换成http://) StringBuilder fullUrl = new StringBuilder("https://").append(domainName).append(path); // 拼接查询参数 if (queryParams != null && !queryParams.isEmpty()) { fullUrl.append("?"); boolean isFirstParam = true; for (Map.Entry<String, String> entry : queryParams.entrySet()) { if (!isFirstParam) { fullUrl.append("&"); } fullUrl.append(entry.getKey()).append("=").append(entry.getValue()); isFirstParam = false; } } String sourceUrl = fullUrl.toString(); context.getLogger().log("源URL:" + sourceUrl); return sourceUrl; } }
如果你的API用了自定义域名,直接替换domainName为自定义域名即可,逻辑完全通用。
传递查询参数数组的替代方案
确实,API Gateway REST API V1默认不支持?numbers=1&numbers=2这种多值参数直接转成数组,但有几个实用的解法:
方法1:启用多值查询参数(REST API V1)
在API Gateway的集成请求设置里,找到「多值查询字符串参数」选项并勾选启用。开启后,Lambda的输入里会新增一个multiValueQueryStringParameters字段,类型是Map<String, List<String>>,直接就能拿到参数对应的数组:
Map<String, Object> input = ...; // Lambda输入 Map<String, java.util.List<String>> multiQueryParams = (Map<String, java.util.List<String>>) input.get("multiValueQueryStringParameters"); if (multiQueryParams != null) { java.util.List<String> numbersList = multiQueryParams.get("numbers"); // 转成整数数组 int[] numbers = numbersList.stream().mapToInt(Integer::parseInt).toArray(); }
这个是最标准的方案,适合需要严格遵循HTTP多值参数规范的场景。
方法2:用逗号分隔字符串(通用方案)
如果不想修改API Gateway配置,可以让前端把数组拼成逗号分隔的字符串,比如?numbers=1,2,3,然后在Lambda里拆分:
Map<String, String> queryParams = (Map<String, String>) input.get("queryStringParameters"); if (queryParams != null && queryParams.containsKey("numbers")) { String numbersStr = queryParams.get("numbers"); String[] numbersArray = numbersStr.split(","); // 处理数组逻辑 }
这种方法简单粗暴,兼容性好,不管是REST API还是HTTP API都能用。
方法3:使用HTTP API(API Gateway V2)
如果你的项目还在选型阶段,可以考虑用API Gateway V2的HTTP API,它默认支持多值查询参数,Lambda输入里会直接包含multiValueQueryStringParameters字段,不需要额外配置。
内容的提问来源于stack exchange,提问作者sedovav
相关产品推荐
相关产品推荐

