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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:29:06