вернуть полезную нагрузку для API Gateway AWS

Я создал лямбда-функцию в Python 3.6, чтобы возвращать несколько записей на шлюз API. стандарт возврата согласно документации должно быть:

{
  "isBase64Encoded" : "boolean",
  "statusCode": "number",
  "headers": { ... },
  "body": "JSON string"
}

Однако мне нужно вернуть данные, кэшированные из списка и проанализированные в формате JSON, чтобы вернуть в требуемом формате, но этого не происходит, по-видимому, я не могу присвоить переменную body:

def lambda_handler(event, context):

   if event["httpMethod"] == "GET":
       param1 = event["queryStringParameters"]["param1"]
       param2 = event["queryStringParameters"]["param2"]


   info = redshift_get_output(param1,param2)
   payload = json.dumps(info)

   print(payload)

   outcome = {
    "isBase64Encoded": 'false',
    "statusCode": 200,
    "headers": { "header": "headerValue" },
    "body": payload
    }

   return outcome

Когда я запускаю его таким образом, я получаю сообщение об успешном выполнении в своем API-шлюзе, но тело ничего не содержит :(

введите здесь описание изображения

Кто-то знает, как я могу это понять, пожалуйста. Спасибо


person Andres Urrego Angel    schedule 06.07.2018    source источник
comment
print(payload) записывал ли что-нибудь в лямбда-журнал?   -  person Michael - sqlbot    schedule 07.07.2018
comment
Нет, это было не просто для того, чтобы убедиться, что я действительно получаю строку так, как мне нужно, но похоже, что я не могу отправить свои данные json в переменной, это должно быть что-то жестко запрограммированное :(   -  person Andres Urrego Angel    schedule 07.07.2018
comment
Я не могу придумать причины, по которым это не сработает. Я думаю, что ваша переменная просто содержит JSON-представление пустого массива. Зарегистрируйте его в журнале Lambda и проверьте.   -  person Michael - sqlbot    schedule 07.07.2018
comment
@ Michael-sqlbot на самом деле именно поэтому я получаю предыдущую распечатку, чтобы убедиться, что она не пуста, и это не значит, что я действительно не знаю, почему API не может ее распечатать.   -  person Andres Urrego Angel    schedule 09.07.2018
comment
Раньше я спрашивал вас, регистрировал ли что-нибудь print(payload), и вы сказали «нет», но теперь вы отвечаете «да». Это запись в журнал или нет?   -  person Michael - sqlbot    schedule 09.07.2018
comment
Возможная проблема: измените "isBase64Encoded": 'false', на "isBase64Encoded": False,.   -  person Michael - sqlbot    schedule 09.07.2018


Ответы (1)


Я наконец понял это. Дело в том, что даже если я применяю метод приведения для своей полезной нагрузки к JSON, возвращаемая строка всегда имеет в начале и в конце квадратные скобки [].

Я создал функцию замены клиента, чтобы удалить скобки и передать своей функции возврата полезную нагрузку без [].

Сценарий:

def replace_all(text, dic):
    for i, j in dic.items():
        text = text.replace(i, j)
    return text


def lambda_handler(event, context):

   if event["httpMethod"] == "GET":
       param1 = event["queryStringParameters"]["param1"]
       param2 = event["queryStringParameters"]["param2"]


   rep = {"[": "", "]": ""} 
   info = redshift_get_output(param1,param2)
   payload = json.dumps(info)
   payload = replace_all(payload,rep)


   print(payload)


   outcome = {
    "isBase64Encoded": 'false',
    "statusCode": 200,
    "headers": { "header": "headerValue" },
    "body": json.loads(payload)
    }

   return outcome

Спасибо

person Andres Urrego Angel    schedule 09.07.2018