AWS ApiGateway和Lambda代理集成-响应结构是否明确?

时间:2020-02-11 19:46:30

标签: c# amazon-web-services aws-lambda aws-api-gateway

我已经知道

For API Gateway to handle a Lambda function's response, the response must be JSON in this format:

git branch -D temp

我还通过检查the doc's example中的常规{ "isBase64Encoded": true|false, "statusCode": httpStatusCode, "headers": { "headerName": "headerValue", ... }, "body": "..." } 来对其进行了验证。

enter image description here

但是,查看同一页面上的second example,它显示了无服务器应用程序lambda,它实际上是控制器

但是:控制器继​​承Function Handler,而不继承: ControllerBase作为I see when I create a new lambda serverless project
另外-我看不到它们使用与同一页面上第一个示例相同的响应结构。

问题:

为什么第二个示例不强制在同一页面上返回与第一个示例相同的固定结构JSON?以及为什么控制器的基类不同?

2 个答案:

答案 0 :(得分:1)

好吧,在原始问题的后面有几个隐性问题。我会尽量不花很多时间来解决您的问题:

  1. 在第二个示例中,AWS AspNetCoreServer接受IActionResult(实际上是OkObjectResult)并返回lambda运行时可以解释为响应的内容(APIGatewayProxyResponse也发生了同样的事情)。对API Gateway的响应是具有以下结构的JSON文档。
{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
    "body": "..."
}
  1. Controller实际上是从ControllerBase继承的,并添加了一些用于处理视图的内容(例如View方法和ViewBag)和其他一些内容。这是使用每种方法构建的控制器的示例。
[Route("[controller]")]
public class AnswerController : Controller
{
    [HttpPost("")]
    public IActionResult Post([FromBody]Answer answer)
    {
        if (ModelState.IsValid) 
        {
            return BadRequest(ModelState);
        }

        // yadda yadda yadda
    }
}

[ApiController]
[Route("[controller]")]
public class AnswerController : ControllerBase
{
    [HttpPost("")]
    public IActionResult Post(Answer answer)
    {
        // yadda yadda yadda
    }
}

答案 1 :(得分:0)

An answer from Norm Johanson

❝控制器方法的返回不需要匹配什么API 网关期望。它可以返回您通常想要的任何值 从控制器返回。 Amazoon.Lambda.AspNetCoreServer 在Lambda中托管ASP.NET Core应用程序的软件包需要 负责翻译从控制器返回的响应 进入API网关的预期。❝