Как создать тело ответа с асинхронно созданными фрагментами тела в Swift Vapor

Я изучаю структуру Swift Vapor.

Я пытаюсь создать класс контроллера, который отображает данные, полученные по SSL-ссылке, на стороннюю систему (сервер АТС Asterisk ...) в тело ответа, которое через некоторое время отправляется клиенту.

Поэтому мне нужно отправлять полученные текстовые строки (полученные отдельно по SSL-соединению) по мере их поступления, не дожидаясь создания «полного ответа».

Видя этот пример:

return Response(status: .ok) { chunker in
  for name in ["joe\n", "pam\n", "cheryl\n"] {
      sleep(1)
      try chunker.send(name)
  }

  try chunker.close()
}

Я подумал, что это может быть выход.

Но то, что я вижу при подключении к серверу Vapor, - это то, что вызов REST ожидает завершения цикла, прежде чем в результате будут получены три строки.

Как я могу получить возможность попробовать chunker.send (name) отправить его символы обратно клиенту, не дожидаясь завершения цикла?

В реальном коде метод контроллера потенциально может поддерживать соединение HTTP с клиентом открытым в течение длительного времени, отправляя данные активности Asterisk клиенту, как только они будут получены. Таким образом, каждый .send (name) должен фактически немедленно передавать данные клиенту, не дожидаясь последнего вызова .close ().

Добавление попытки chunker.flush () не дало лучшего результата ..


person aaberga    schedule 17.12.2016    source источник


Ответы (1)


HTTP-запросы на самом деле не предназначены для такой работы. Различные браузеры и клиенты будут работать по-разному в зависимости от их реализации.

Например, если вы подключитесь с помощью telnet к вставленному вами примеру чанкера, вы увидите, что данные отправляются каждую секунду. Но Safari, с другой стороны, будет ждать всего ответа перед отображением.

Если вы хотите надежно отправлять такие фрагментированные данные, вам следует использовать разработанный для этого протокол, например WebSockets.

person tanner0101    schedule 20.12.2016
comment
Привет! Спасибо за заметку. Я обнаружил, что разбиение на части действительно работает. Просто и Лапа, и Почтальон были недостаточно любезны, чтобы показать непрерывный поток сигналов. - person aaberga; 25.12.2016
comment
Safari, otoh, показывает все как есть. И, да, веб-сокеты имеют больше смысла в таких приложениях. Но прямо сейчас я просто искал что-нибудь быстрое, чтобы протестировать сокет SSL, который Vapor предлагает бесплатно (для фактического подключения к Asterisk в безопасном стиле связи telnet). - person aaberga; 25.12.2016
comment
Как бы безумно это ни звучало (HTTP не предназначен для этого ...) Я смог получить вызов GET продолжительностью более часа, получая поток данных SSL с удаленной АТС, проксируемый на веб-страницу Safari. Настоящая вещь, очевидно, перейдет на веб-сокеты! Но спасибо за все вкусности внутри Vapor !! - person aaberga; 25.12.2016