Может ли 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 находится здесь:

https://raw.githubusercontent.com/grokify/chathooks/master/docs/handlers/wootric/event-example_response-created.txt

Проблема с GitHub здесь:

https://github.com/grokify/chathooks/issues/15

Сообщение об ошибке кажется довольно подробным, но я хотел спросить:

  1. Есть ли обходной путь для настройки шлюза API для поддержки обоих?
  2. Существует ли основанная на стандартах причина, по которой 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»);

Другие вопросы по тегам