如何解决来自浏览器的 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 举报,一经查实,本站将立刻删除。