微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

来自浏览器的 C# AWS Lambda API Gateway - 参数不起作用

如何解决来自浏览器的 C# AWS Lambda API Gateway - 参数不起作用

使用简单的 C# AWS Lambda

        public string FunctionHandler(string myParam1,ILambdaContext context)
        {
            return myParam1;
        }

我应该如何通过浏览器 GET 请求将参数传递给 AWS Lambda 函数 + API 网关? 我想要这样的东西,例如: https://[API ID].execute-api.[REGION].amazonaws.com/myFunc?myParam1=myValue1

在浏览器中显示 {"message":"Internal Server Error"}

在日志中显示 Error converting the Lambda event JSON payload to a string. JSON strings must be quoted,for example "Hello World" in order to be converted to a string: The JSON value Could not be converted to System.String.

没有参数就可以工作,例如:

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

在浏览器中发送 GET 请求时 https://[API ID].execute-api.[REGION].amazonaws.com/myFunc 返回成功 {"AwsRequestId":"86ca2da9-438c-4865-8a0b-29d3ced37176","FunctionName":...

解决方法

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

public string FunctionHandler(Stream requestStream,ILambdaContext context) { ... }

这里的requestStream里面会有GET/POST的参数或者更大的JSON,但是需要手动解析。请注意,参数可能会被发送 b64 编码(或可能也被压缩)。一个好方法是找到一个进行这种解析的库。 就我而言,我还编写了消费者 JS 代码,因此我可以确保参数始终以相同的方式出现,这样我的问题就解决了,但如果有人知道一个很好的库,请告诉。

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

        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));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。