Отправить запрос с телом в AWS Lambda - PullRequest
0 голосов
/ 10 января 2019

Я загрузил функцию AWS Lambda, где lambda_handler выглядит следующим образом:

import json
def lambda_handler(event, context):

    print(event)

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!'),
        'event': event
    }

Задача 1: возврат event

Когда я тестирую его с помощью Lambda Management Console, я могу создать тестовое событие с параметрами, которые также возвращают точно такой же формат, и все работает нормально:

{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

Однако, когда я использую Почтальон, я получаю что-то совершенно другое, что возвращает мне:

{
    "message": "Internal server error"
}

Я подозреваю, что это потому, что event выглядит примерно так:

{'resource': '/hello', 'path': '/hello', 'httpMethod': 'GET', 'headers': {'Accept': '*/*', ... etc

Проблема 2: добавление параметров json в тело создает ошибку

Когда я пытаюсь в Postman добавить в тело> raw> JSON (приложение / JSON) ключи выше, я получаю сообщение об ошибке:

ERROR: The request could not be satisfied

Вопросы

У меня есть два вопроса:

  • Как передать параметры в теле и получить возможность записывать его в лямбда-выражении AWS, используя событие или контекст?
  • Как правильно вернуть событие?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Выяснил это после помощи @Althar Khan.

Очевидно, что шлюз API AWS Lambda принимает только определенные свойства:

...
return {
    "statusCode": 200,
    "headers": {
        "my_header": "my_value"
    },
    "body": JSON.stringify(responseBody),
    "isBase64Encoded": false
};

В этом ответе есть четыре поля: statusCode, headers, body и isBase64Encoded.

В этом примере ответ функции находится в формате, ожидаемом шлюзом API. Для получения дополнительной информации см. Выходной формат лямбда-функции для интеграции прокси .

0 голосов
/ 10 января 2019

Предполагается, что вы настроили Lambda в качестве интеграции прокси в AWS API Gateway. Если вы хотите прикрепить параметры строки запроса, а не тело, тип вашего метода должен быть GET.

Событие, которое вы получите в своей Lambda для запроса /GET your-path/?myKey1=value1&myKey2=value2, должно выглядеть примерно так:

{
    "resource": "",
    "path": "/your-path",
    "httpMethod": "GET",
    "headers": {
    },
    "queryStringParameters": {
      "myKey1": "value1",
      "myKey2": "value2"
    },
    "pathParameters": {
    },        
    "body": "{}"
  }

Вы можете получить доступ к параметрам строки запроса в свойстве queryStringParameters.

Если вы отправляете запрос с использованием Postman и прикрепляете тело, тогда ваш тип интеграции Lambda должен быть POST / PUT. Данные, которые вы добавляете в тело запроса Почтальона, будут доступны в event["body"].

Последнее, что если вы протестируете лямбду непосредственно в консоли, то событие будет получено, как вы положили в тело. Вам нужно будет отформатировать ваше событие в соответствии с типом метода интеграции. Если это POST / PUT, то:

{
 "body": {
   "someValue": {..}
 }
}

Если это GET, то:

{
 "queryStringParameters": {
    "myKey1": "value1",
    "myKey2": "value2"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...