提问人:Darren Oakey 提问时间:9/7/2023 最后编辑:Jeremy ThompsonDarren Oakey 更新时间:9/8/2023 访问量:73
从 .net lambda 返回非 200 Http 状态 - 不使用 API 网关
Return a non-200 Http Status from a .net lambda - without an API Gateway
问:
我正在尝试使用 amazon.lambda.core 从 .net 返回其他 http 状态代码 - 我尝试将其作为处理程序:
public async Task<string> Handler(string input, ILambdaContext context)
{
await Task.FromResult(0);
throw new AmazonLambdaException(Json.Serialize(new { error = "Your specific error message" }), ErrorType.Sender,
"Bad Request", "abc", HttpStatusCode.BadRequest);
}
但是当我从例如python客户端应用程序调用它时 - 我得到:
响应 =
{'RequestId': 'xxx', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Thu, 07 Sep 2023 07:29:09 GMT', 'content-type': 'application/json', 'content-length': '1053', 'connection': 'keep-alive', 'x-amzn-requestid': 'xxxx', 'x-amz-function-error': 'Unhandled', 'x-amzn-remapped-content-length': '0', 'x-amz-executed-version': '$LATEST', 'x-amzn-trace-id': 'root=xxx;sampled=1;lineage=xxx:0'}, 'RetryAttempts': 0}, 'StatusCode': 200, 'FunctionError': 'Unhandled', 'ExecutedVersion': '$LATEST', 'Payload': <botocore.response.StreamingBody object at 0x0000021A6B813100>}
我想改变的关键是状态码 200 - 可能吗?
注意 - 这张图片中不涉及 api 网关 - 只有一件事直接对 lambda 函数进行 http 调用(尽管在这种情况下我从 boto3 调用它)
答:
0赞
Jeremy Thompson
9/7/2023
#1
我认为正在发生的事情是,从客户端的角度来看,调用执行正常,但在内部失败,您实际上没有返回任何东西!您只需在运行在小型容器中的 Lambda 中抛出一个错误。
查看文档 APIGatewayProxyResponse,他们返回以下内容:
var response = new APIGatewayHttpApiV2ProxyResponse
{
StatusCode = (int)HttpStatusCode.OK,
Body = "Hello AWS Serverless",
Headers = new Dictionary<string, string> { { "Content-Type",
"text/plain" } }
};
return response;
}
所以你可以做这样的事情:
public async Task<APIGatewayProxyResponse> Handler(APIGatewayProxyRequest request, ILambdaContext context)
{
if (1 == 1)
{
return new APIGatewayProxyResponse
{
StatusCode = 400,
Body = "Something Bad happened with the request",
Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }
};
}
}
您应该会在 Lambda 的 CloudWatch 日志中获得一些提示(即您抛出的异常)。
更新
如果没有涉及 API GW(我一开始没有完全注意到),并且您返回了一个 ,那么只需执行 Python 或 Node 所做的操作:string
import json
def lambda_handler(event, context):
return {
'statusCode': 400,
'body': json.dumps('BadRequest')
}
控制台有点误导,看看它在这里是如何失败的,并且没有返回 400。状态显示只有两种状态:“成功”和“失败”。有了 API,GW HTTP 概念就发挥了更大的作用。
评论
0赞
Darren Oakey
9/8/2023
很酷 - 会尝试 - 谢谢!
0赞
Darren Oakey
9/8/2023
是的 - 不幸的是 - 没有全部工作 - 它只是附带了序列化 APIGonegentialProxyResponse 的有效负载......但状态代码为 200。注意 - 我直接调用 lambda - 不使用 api 网关。在这种情况下,API 网关不是一个选项
0赞
Jeremy Thompson
9/8/2023
我试了一下,我想我理解了这个问题 - 从另一个服务调用 Lambda,你想知道它是否失败,要回答你原来的问题,如果没有 API GW,就不可能从 200 更改状态码,你必须根据屏幕截图解析文本/json 响应。不是理想的解决方案。
0赞
Darren Oakey
9/9/2023
是的 - 不幸的是 - 问题是 - 我们控制 lambda - 但我们不控制消费者 - 他们只是直接对我们进行 lambda 调用 - 他们总是说“哦,你成功了吗?
评论