AWS API Gateway Websockets - где находится идентификатор соединения? - PullRequest
0 голосов
/ 10 января 2019

Я настраиваю веб-сокеты AWS API Gateway с настраиваемым авторизатором на маршруте $ connect, как описано здесь:

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-route-keys-connect-disconnect.html

У меня вопрос - как мне получить connectionID, то есть идентификатор, который я могу использовать для последующей широковещательной передачи этому подключенному клиенту?

Ответы [ 4 ]

0 голосов
/ 06 апреля 2019

Большое спасибо Франсуа Старку, очень помогли.

Проведя собственные эксперименты, я обнаружил, что вы можете избежать необходимости сопоставлять конкретные значения $ request.body.action, используя маршрут по умолчанию $ и следующий формат:

  • Выражение выбора шаблона: \ $ default <- важен слеш </li>
  • Ключ шаблона: \ $ default <- снова слеш </li>
  • Создать шаблон с
{"connectionId": "$context.connectionId", "body": $input.body}

С этой конфигурацией ваша конечная точка HTTP должна получить connectionID как данные тела во всех значениях 'action', используя один маршрут.

Кроме того, для получения идентификаторов соединений в маршрутах $connect и $disconnect формат шаблона запроса одинаков, но, поскольку в этих событиях нет данных тела, вы можете опустить тело:

  • Выражение выбора шаблона: \ $ default <- важен слеш </li>
  • Ключ шаблона: \ $ default <- снова косая черта </li>
  • Создать шаблон с
{"connectionId": "$context.connectionId"}

При такой конфигурации ваша конечная точка HTTP должна получить connectionID в виде данных тела в событиях $ connect и $ disconnect.

0 голосов
/ 07 февраля 2019

Проблема заключалась в том, что при использовании HTTP в качестве типа интеграции - т. Е. При обращении к конечным точкам http при вызове одного или нескольких ваших маршрутов API GW ($ connect / $ disconnect / $ invoke). Мы обнаружили, что не можем прокси-запрос (это означает, что мы теряем оригинальные заголовки, включая аутентификацию), но если нам нужен идентификатор соединения, мы должны указать шаблон запроса и использовать что-то вроде:

{"connectionId": "$ context.connectionId", "body": "$ input.body"}

0 голосов
/ 28 февраля 2019

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

Пытаясь ответить на вопрос Big Endian, я обнаружил некоторые проблемы - мой бэкэнд CakePHP не будет декодировать цитируемое тело json. Я нашел решение, но было много других шагов, необходимых для реализации его ответа, поэтому вот они:

Я создал ключ маршрута с отключенным HTTP-прокси и настроил шаблон запроса следующим образом (также очень скудная документация):

  • Выражение выбора маршрута: $ request.body.action
  • Ключ маршрута: подписаться
    Это означает, что все запросы с {"action": "subscribe"} будут перенаправляться сюда

  • Тип запроса на интеграцию: HTTP

  • Интеграция прокси-сервера HTTP: выключено - для заголовка или авторизации через
  • HTTP-метод: POST

А затем по самой сложной части: настройка шаблона запроса. Я хотел, чтобы все запросы «подписки» использовали этот шаблон, и единственный способ, который я нашел, это установить для выражения выбора шаблона то же самое, что и для выражения выбора маршрута: $ request.body.action, и установить ключ шаблона на «подписку». ».

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

И, наконец, последний шаг - ввести это как «Создать шаблон» для «подписки»:

{"connectionId": "$context.connectionId", "body": $input.body}

Обратите внимание, что в моем случае мое тело было json, а $ input.body не в кавычках - тело json расширяется шаблоном. Я полагаю, если тело это просто строка, то шаблон будет

{"connectionId": "$context.connectionId", "body": "$input.body"}

но тогда маршрутизация никогда не попадет сюда, так как для маршрутизации необходимо, чтобы тело содержало ключ действия в json.

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

Вы можете получить connectionId из контекстных переменных. Посмотрите это для доступных переменных для API WebSocket: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-mapping-template-reference.html

В лямбда-функции вы можете обращаться к переменным контекста через event.requestContext.

...