Может ли AWS API Gateway поддерживать ʻapplication/x-www-form-urlencoded` с параметрами тела и URL (строки запроса)?
Многие службы могут принимать параметры строки запроса в URL-адресе, когда POST
запрос сделан с Content-Type: application/x-www-form-urlencoded
и другие параметры в теле, но кажется, что AWS API Gateway не может.
Когда я вызываю AWS API Gateway с POST
Шаблон сопоставления для application/x-www-form-urlencoded
и параметры URL-адреса строки запроса (с помощью лямбда-функции), я получаю следующую ошибку:
{
"message":"When Content-Type:application/x-www-form-urlencoded, \
URL cannot include query-string parameters (after '?'): \
'/prod/webhook?inputType=wootric&outputType=glip&url=...'"
}
Вот пример cURL:
curl -XPOST 'https://{myid}.execute-api.{myregion}.amazonaws.com/prod/webhook? \
inputType=wootric&outputType=glip&url=https://hooks.glip.com/webhook/ \
11112222-3333-4444-5555-666677778888' \
-d "@docs/handlers/wootric/event-example_response-created.txt" \
-H 'Content-Type: application/x-www-form-urlencoded' -v
Конкретная цель - отправить событие веб-перехватчика Wootric в функцию Lambda, используя URL-адрес с параметрами строки запроса.
Вы можете получить код здесь:
https://github.com/grokify/chathooks
Файл тела события Wootric находится здесь:
Проблема с GitHub здесь:
https://github.com/grokify/chathooks/issues/15
Сообщение об ошибке кажется довольно подробным, но я хотел спросить:
- Есть ли обходной путь для настройки шлюза API для поддержки обоих?
- Существует ли основанная на стандартах причина, по которой AWS не поддерживает это, или это всего лишь проектное решение / ограничение?
Если для этого нет решения, есть ли хорошее легкое решение, кроме развертывания размещенного серверного решения, такого как Heroku. Кроме того, поддерживают ли это другие облачные службы с помощью своего шлюза API + облачные функции, например Google?
Некоторые примеры, демонстрирующие поддержку обоих:
4 ответа
Я не уверен, правильно ли я понял вопрос, но если вы хотите получить доступ к телу запроса, закодированному какapplication/x-www-form-urlencoded
(или вообще что угодно) в вашей лямбда-функции вы должны использоватьLAMBDA_PROXY
запросите тип интеграции (он же отметьте флажок «Использовать интеграцию Lambda Proxy») при создании метода для вашего ресурса. Затем вы можете получить доступ к телу запроса вevent.body
поле как обычный текст в вашей лямбда-функции и проанализируйте его вручную.
Да, есть обходной путь, и основная проблема заключается в установке шаблона сопоставления, который преобразует строку в json . Очень подробный пример показан в API Gateway любого типа контента.
У меня была аналогичная проблема со сторонним поставщиком, использующим веб-хуки. Оказывается, мой провайдер преобразует путь URL из
UPPERCASE
к
LOWERCASE
. Пример, конечная точка должна быть вместо
apigateway.com/dev/0bscur3dpathRANDOM
. Вы уловили суть.
Установите свойство запроса как «Content-Type», «application / json» для вашего HttpURLConnection, как показано ниже: connection.setRequestProperty («Content-Type», «application / json»);