2016-12-17 4 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() 
} 

この例を見て。

しかし、蒸気サーバーに接続すると、3つの回線が結果として受信される前に、REST呼び出しがループを完了するのを待つことになります。

私はどのようにしてchunker.send(name)を試してみると、最初にループが完了するのを待たずに文字をクライアントに送り返すことができますか?

実際のコードでは、コントローラメソッドはクライアントへのHTTP接続を長期間開いたままにして、Asteriskアクティビティデータを取得するとすぐにクライアントに送信する可能性があります。つまり、各.send(name)は実際には最後の.close()呼び出しを待つことなく、すぐにクライアントにデータを渡すべきです。トライchunker.flushを追加

()が任意のより良い結果を生成しませんでした。..

答えて

1

HTTPリクエストは本当にそのように動作するように設計されていません。実装されているブラウザとクライアントの機能は、実装によって異なります。

たとえば、ペーストしたチャンクの例にtelnetと接続すると、毎秒データが送信されます。しかし、Safariは表示する前に応答全体を待つことになります。

このようなチャンクデータを確実に送信するには、そのために設計されたWebSocketのようなプロトコルを使用する必要があります。

+0

こんにちは!あなたのメモに感謝します。私が発見したのは、チャンクが実際に動作することです。 PawとPostmanの両方がシグナルの流れを示すのに十分親切ではなかったことだけです。 – aaberga

+0

Safari、otoh、すべてのことが表示されます。そして、はい、WebSocketはこの種のアプリケーションでより意味を成しています。しかし今は、Vaporが無料で(実際には安全なTelnetスタイルのリンクでAsteriskに接続する)SSLソケットをテストするための素早いものを探していました。 – aaberga

+0

私はGETコールをSafari WebページにプロキシされたリモートPBXからSSLデータフローを取得する1時間以上持続させることができました。本当のことは明らかにウェブソケットに移行します!しかし、蒸気の中のすべてのおいしいものに感謝!! – aaberga

関連する問題