AWS Интеграция ApiGateway и Lambda-прокси - уточнение структуры ответа? - PullRequest
0 голосов
/ 11 февраля 2020

Я уже знаю, что

Чтобы API-шлюз обрабатывал ответ функции Lambda, ответ должен быть JSON в следующем формате:

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

Я также проверил это, проверив пример do c для обычного Function Handler.

enter image description here

Но, глядя на второй пример на той же странице, он показывает лямбда-серверное приложение, которое на самом деле является контроллером

Однако: контроллер наследует : ControllerBase, а не : Controller как Я вижу, когда я создаю новый лямбда-серверный проект
Также - я не вижу, чтобы они использовали ту же структуру ответа, что и в первом примере на этой же странице.

Вопрос:

Почему второй пример не вынуждает возвращать ту же фиксированную структуру JSON, что и в первом примере того же самого страница? а почему контроллеры базового класса разные?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Хорошо, за оригинальным вопросом скрывается несколько скрытых вопросов. Я постараюсь решить ваши проблемы в меру своих возможностей, не занимая много вашего времени:

  1. Во втором примере AWS AspNetCoreServer принимает IActionResult (что на самом деле OkObjectResult) и возвращает что-то, что лямбда-среда может интерпретировать как ответ (то же самое происходит с APIGatewayProxyResponse). Ответами на API Gateway являются JSON документы со структурой ниже.
{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "multiValueHeaders": { "headerName": ["headerValue", "headerValue2", ...], ... },
    "body": "..."
}
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
    }
}
0 голосов
/ 12 февраля 2020

Ответ от Норма Джохансона :

return Возвращение метода контроллера не обязательно должно соответствовать ожидаемому API-шлюзу. Он может вернуть все, что вы обычно хотите вернуть обратно из контроллера. Пакет Amazoon.Lambda.AspNetCoreServer, на котором размещено базовое приложение ASP. NET в Lambda, заботится о преобразовании ответа, полученного от контроллера, в ожидаемый API Gateway. ❝

...