AWS API Gateway передает только 1-ю переменную в функцию, но лямбда-тест проходит все - PullRequest
0 голосов
/ 24 июня 2018

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

KeywordSearch(keyword,page,RPP)

который передает 3 переменные в keywordSearch.В лямбда-IDE-тесте он работает без проблем и выводит все 3 переменные, которые отображаются в журналах как

InsideKeywordSearch, Vars=: 
keyword: 
bombing
 page: 
1
 RPP: 
10

Но когда я запускаю тест API-шлюза, журнал показывает, что переменная не передается вФункция, как видно из журнала, не показывает переменную для RPP или Page.

Ключевое слово передается только.Я не правильно определяю функцию?это работает в лямбде, почему не API-шлюз, если это так?Вот фрагмент кода.

Вызов функции

def handler(event, context):
print('Inside Handler Funciton')
keyword = event.get('search_keyword', None)
id = event.get('id', None)
RPP = event.get('RPP', 10)
page = event.get('page', 1)
#get event variables, if passed and filter bad input
print("keyword")
print(keyword)
print("id")
print(id)
print('RPP')
print(RPP)
print('page')
print(page)
if keyword is not None:
    return keywordSearch(keyword,page,RPP)
elif id is not None:
    return idSearch(id)
else:
    return ""

Функция

def keywordSearch (keyword, page, RPP):
    print('InsideKeywordSearch, Vars=: ')
    print("keyword: ")
    print(keyword)
    print(" page: ")
    print(page)
    print(" RPP: ")
    print(RPP)

Показывает лямбда-журналы

Журналы функций:

6d Version: $LATEST
Inside Handler Funciton
keyword
bombing
id
None
RPP
10
page
1
InsideKeywordSearch, Vars=: 
keyword: 
bombing
 page: 
1
 RPP: 
10
[INFO]  2018-06-30T03:04:56.240Z    5dc7a2cc-7c12-11e8-8f39-f5112d2e976d    SUCCESS: Connection to RDS mysql instance succeeded

Шлюз APIвызов показывает

{
  "errorMessage": "unsupported operand type(s) for -: 'str' and 'int'",
  "errorType": "TypeError",
  "stackTrace": [
    [
      "/var/task/app.py",
      144,
      "handler",
      "return keywordSearch(keyword,page,RPP)"
    ],
    [
      "/var/task/app.py",
      93,
      "keywordSearch",
      "sql = f\"SELECT attackid, SUM(MATCH(attack_fulltext) AGAINST('%{keyword}%' IN BOOLEAN MODE)) as score FROM search_index WHERE MATCH(attack_fulltext) AGAINST('%{keyword}%' IN BOOLEAN MODE) GROUP BY attackid ORDER BY score DESC Limit { ((page-1)*RPP) },{(RPP)};\""
    ]
  ]
}

, который говорит мне, что он не передает переменные, потому что строка SQL становится недействительной.

1 Ответ

0 голосов
/ 29 июля 2018

Проблема заключалась в том, что шлюз API передавал число в виде строки.Мне пришлось исправить шаблон отображения метода get в запросе на интеграцию следующим образом:

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

{
    "search_keyword" : "$input.params('search_keyword')",
    "page": "$input.params('page')",
    "RPP": "$input.params('RPP')"
}

до:

{
    "search_keyword" : "$input.params('search_keyword')",
    "page": $input.params('page'),
    "RPP": $input.params('RPP')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...