来自浏览器的C#AWS Lambda API网关-参数不工作

来自浏览器的C#AWS Lambda API网关-参数不工作,c#,amazon-web-services,aws-lambda,get,aws-api-gateway,C#,Amazon Web Services,Aws Lambda,Get,Aws Api Gateway,用一个简单的C#AWS Lambda public string FunctionHandler(string myParam1, ILambdaContext context) { return myParam1; } 如何通过浏览器GET请求将参数传递给AWS Lambda函数+API网关? 我想要这样的东西,例如: https://[API ID]。执行API。[区域].amazonaws.com/myFunc?my

用一个简单的C#AWS Lambda

        public string FunctionHandler(string myParam1, ILambdaContext context)
        {
            return myParam1;
        }
如何通过浏览器GET请求将参数传递给AWS Lambda函数+API网关? 我想要这样的东西,例如:
https://[API ID]。执行API。[区域].amazonaws.com/myFunc?myParam1=myValue1

在浏览器中显示
{“消息”:“内部服务器错误”}

在日志中,它表示将Lambda事件JSON负载转换为字符串时出错。必须引用JSON字符串,例如“Hello World”才能转换为字符串:JSON值无法转换为System.string。

如果没有参数,它将工作,例如:

        public string FunctionHandler(ILambdaContext context)
        {
            return Utf8Json.JsonSerializer.ToJsonString(context);
        }

在浏览器中发送GET请求时
https://[API ID]。执行API.[REGION]。amazonaws.com/myFunc
成功返回
{“AwsRequestId”:“86ca2da9-438c-4865-8a0b-29D3CED337176”,“FunctionName”:…

好的,我找到了一个解决方案,不使用内置的参数解析,而是可以通过读取流来读取完整的JSON参数:

public string FunctionHandler(Stream requestStream, ILambdaContext context) { ... }
此处的requestStream将包含GET/POST参数或更大的JSON,但必须手动解析。请注意,这些参数可能是通过b64编码(或可能也是压缩的)发送的。一个好方法是找到一个进行此解析的库。 在我的例子中,我还编写了consumer JS代码,因此我可以确保参数总是以相同的方式出现,这样我的问题就解决了,但是如果有人知道这方面的好库,请告诉我

还支持b64编码的手动请求后数据提取示例:

        public class StreamBody
        {
            public string body;
            public bool isBase64Encoded;
        }

        public string FunctionHandler(Stream requestStream, ILambdaContext context)
        {
            using var sr = new StreamReader(requestStream);
            var input = sr.ReadToEnd();
            var sbody = Utf8Json.JsonSerializer.Deserialize<StreamBody>(input);
            var body = !sbody.isBase64Encoded ? sbody.body : Encoding.UTF8.GetString(Convert.FromBase64String(sbody.body));
公共类流体
{
公共机构;
公共bool是base64编码的;
}
公共字符串FunctionHandler(流请求流、ILambdaContext上下文)
{
使用var sr=newstreamreader(requestStream);
var输入=sr.ReadToEnd();
var sbody=Utf8Json.JsonSerializer.Deserialize(输入);
var body=!sbody.isBase64Encoded?sbody.body:Encoding.UTF8.GetString(Convert.FromBase64String(sbody.body));

在使用Visual Studio AWS Lambda function tester插件时,以及在AWS网站上进行测试时,我已成功地传递了各种参数,但从未通过浏览器的简单GET/POST请求传递过这些参数,这正是我所需要的。您是否已尝试打印/记录“ILambdaContext”的raws内容json转换逻辑之前?查看其工作时间[即Visual Studio AWS Lambda function tester插件,以及从AWS网站进行测试]与出现问题时间[即从web浏览器]之间的差异这也是可行的,但是上下文并不有趣,我只是想看看参数是否在某个地方。我也尝试过常量字符串,重点是函数在没有参数的情况下运行。