2017-02-08 9 views
1

私は、クライアントの要求に応じて、バックグラウンドで特定のタスクを実行するHTTPサーバーを持っています。このサーバーは、結果をクライアントに返すまでに少し時間がかかることがあります。httpクライアントへのカスタムの進捗状況

特定のバックグラウンドタスクに関する進捗情報をクライアントに更新する方法はありますか?

XMLHttpRequestの進捗ハンドラがありますが、正しく理解すれば、データ転送の進捗のみに使用されます。私のアプリケーションで

、流れの例がこれです:

  1. クライアントが要求をGET送信します。
  2. サーバーには時間がかかることがあります。物事の進行状況をクライアントに更新するには?
  3. サーバーがクライアントに応答を返します。データサイズによっては時間がかかることもあります。 XMLHttpRequest progressイベントをここで使用できます。

この部分はhttpの仕様ですか?または何か他のものが必要ですか(websocket ..?)

ありがとう!

答えて

0

server-sent eventsを使用することを検討する必要があります。

サーバー送信されたイベントをネットワーク高性能 ブラウザ:ここではそれについての詳細を学ぶためにいくつかの場所がありますnatively supported in Chrome, Opera, Firefox, and Safariであり、polyfills you can use to make server-sent events work in Edge/IE、さらにはjQuery pluginである。

ここではいくつかのクライアント側のコードの非常に単純な例です:サーバー側で

var source = new EventSource("/server-side-app-that-gives-progress-updates") 
source.onmessage = function(e) { 
    console.log(e.data); 
} 

、あなたの/server-side-app-that-gives-progress-updatesアプリはちょうどこのようにフォーマットテキスト形式のデータを送り返す:

data: some data\n 
data: more data\n\n 

それContent-Type: text/event-streamヘッダーで応答を送信することでストリーミングを開始します。上記のクライアントコードは、それを単一のe.dataメッセージとして "some data\more data"と表示します。

サーバーアプリケーションにアップデートがある場合、そのフォームの別のメッセージをレスポンスに書き込みます。

あなたの代わりにJSONの一連のメッセージとして更新を送信したい場合は、サーバーアプリは書き込み:

data: {"foo": "bar", "hoge": "moge"}\n\n 

をそしてあなたのクライアントコードは、これを行うことができます:

source.onmessage = function(e) { 
    var jsonObject = JSON.parse(e.data); 
    console.log(jsonObject.foo); 
} 

もちろんあります上記の場所で学ぶことができます。しかし、それは一言で言えば。


私は、クライアントの要求に応じて、 それがクライアントに 結果を返す前に、少し時間がかかる場合があり、バックグラウンドで特定のタスクを実行し、。httpサーバを持っています

これは、サーバー送信イベントが設計された主な使用例の1つです。

特定のバックグラウンドタスクに関する進行状況情報をクライアントに更新する方法はありますか?

はい、サーバー送信イベントで行うことができます。

ありXMLHttpRequestの進捗ハンドラですが、私が正しく を理解している場合にのみ、データ転送の進行状況のために使われています。

右。 XHRは、応答する前にサーバー上で起こっていることすべてに関する進捗情報を取得することはできません。私のアプリケーションで

、流れの例がこれです:

は、HTTPの仕様のこの部分ですか?

HTTP仕様の一部ではありません(HTTP/2には多少の関連機能があります)。

または私はあなたがこのためにWebSocketをする必要はありません何か他(のWebSocket ..?)

が必要です。 WebSocketは、リアルタイムのチャットアプリケーションなど、クライアントとサーバー間で実際の双方向の全二重通信が必要な場合に最適です。

しかし、質問に記載されているユースケースは、サーバーからクライアントへの更新の一方向通信のみがである必要があります。そしてそれはまさにサーバーが送信したイベントのためのものです。

関連する問題