1

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 呼び出しがループの完了を待ってから、結果として 3 つの行が受信されることがわかります。

最初にループが完了するのを待たずに、chunker.send(name) の文字をクライアントに送り返すようにするにはどうすればよいですか?

実際のコードでは、コントローラー メソッドは、クライアントへの HTTP 接続を長時間開いたままにして、アスタリスク アクティビティ データを取得するとすぐにクライアントに送信する可能性があります。したがって、各 .send(name) は実際には、最後の .close() 呼び出しを待たずに、すぐにデータをクライアントに渡す必要があります。

try chunker.flush() を追加しても、より良い結果は得られませんでした..

4

1 に答える 1

1

HTTP リクエストは、実際にはそのように機能するようには設計されていません。ブラウザーやクライアントが異なれば、その実装によって機能も異なります。

たとえば、telnet貼り付けたチャンカーの例に接続すると、データが毎秒送信されることがわかります。一方、Safari は応答全体を待ってから表示します。

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

于 2016-12-20T01:54:42.867 に答える