2016-12-17 6 views
1

Я изучаю структуру Swift Vapor.Как создать тело ответа с асинхронно созданными кусками тела в Swift Vapor

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

Так что мне нужно отправить полученные текстовые строки (полученные отдельно по 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 (имя) отправить свои символы обратно клиенту, не дождавшись завершения цикла?

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

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

ответ

1

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

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

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

+0

Hi! Спасибо за ваше примечание. Я обнаружил, что на самом деле работает. Просто Лау и Постман не были достаточно любезны, чтобы показать бегущий поток сигналов. – aaberga

+0

Safari, otoh, показывает все так, как бывает. И, да, веб-сокеты имеют больше смысла в этом приложении. Но прямо сейчас я просто искал что-то быстрое, чтобы проверить SSL-сокет, который Vapor предлагает бесплатно (на самом деле подключиться к Asterisk в безопасном стиле telnet ссылки). – aaberga

+0

Как сумасшедший, как это звучит (HTTP не там, чтобы это сделать ...) Я смог получить вызов GET, продолжающийся более часа, чтобы поток данных SSL с удаленной УАТС был проксирован на веб-страницу Safari. Разумеется, реальная вещь переместится на websockets! Но спасибо за все лакомства внутри Vapor !! – aaberga