Html5サーバー送信イベントを使用しています。サーバー側はJavaサーブレットです。サーバーに渡したいjson配列データがあります。
_var source = new EventSource("../GetPointVal?id=100&jsondata=" + JSON.stringify(data));
_
配列サイズが小さい場合、サーバー側はクエリ文字列を取得できます。ただし、配列サイズが大きい場合。 (おそらく数千文字以上)、サーバーはクエリ文字列を取得できません。クエリ文字列の長さの制限を回避できるjson配列をサーバーに渡すために、POST new EventSource(...)
のメソッド)を使用することは可能ですか?
いいえ、SSE標準ではPOSTは許可されていません。
(私が知ることができる限り、技術的な理由はありません-デザイナーがユースケースを見たことがないだけだったと思います:それは大きなデータだけではありませんが、カスタム認証スキームを実行したい場合、 GETデータにパスワードを入れないセキュリティ上の理由。)
XMLHttpRequest
(つまりAJAX)はPOSTを許可するため、1つのオプションは古いlong-poll/cometメソッドに戻ることです。 (私の本 HTML5 SSEを使用したデータプッシュアプリ では、これを行う方法についてかなり詳しく説明しています。)
別のアプローチは、すべてのデータを事前にPOST
してHttpSession
に格納し、SSEプロセスを呼び出すことです。セッションデータ(SSEはCookieをサポートしているため、JSESSIONID
Cookieは正常に機能します。)
追伸 standard は明示的にPOSTは使用できません)とは言いませんが、XMLHttpRequest
とは異なり、使用するhttpメソッドを指定するパラメーターはありません。投稿するデータを指定する方法はありません。
EventSource
APIを使用してこれを行うことはできませんが、サーバーがPOSTリクエストに対して実装できないという技術的な理由はありません。トリックはクライアントにsendリクエスト。例 この回答ではsse.jsについて説明します をEventSource
の代わりに使用します。
このシナリオでイベントソースを機能させるのは、ユーザーがジョブを投稿してジョブトークンを受信できるようにするエンドポイントと、投稿者が結果をリッスンできるようにするエンドポイントを伴う、あまりにも多くの労力です。
サーバーは、トークンと、トークンに関連付けられたユニキャストストリームを格納する必要があります。これにより、1つのテキスト/イベントストリームのみがサブスクライブできます。
このユニキャストストリームは、ストリーミングデータがアップロードされたとき、または接続が切断されたとき、またはユーザーがその間にシステムに対して他の要求を行ったとき、またはユーザーのセッションが期限切れになったときに破棄する必要があります。
より良いアイデアは、ユーザーが情報を投稿し、結果を受け取ることができるWebSocket接続を使用することです。
または、別のphpでカスタマイズしたファイルからデータを読み取ることができます
http://..../command_receiver.php?command = blablabla
command_receiver.php
<?php
$cmd = $_GET['command'];
$fh = fopen("command.txt","w");
fwrite($fh, $cmd);
fclose($fh);
?>
demo2_sse.php
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
//$a = $_GET["what"];
$time = microtime(true); //date('r');
$fa = fopen("command.txt", "r");
$content = fread($fa,filesize("command.txt"));
fclose($fa);
echo "data: [{$content}][{$time}]\n\n";
flush();
?>
次のように、EventSourceは任意の名前のhtmlに含まれています
<!DOCTYPE html>
<html>
<body>
<h1>Getting server updates</h1>
var source = new EventSource("demo2_sse.php");
source.onmessage = function (event) {
mycommand = event.data.substring(1, event.data.indexOf("]"));
mytime = event.data.substring(event.data.lastIndexOf("[") + 1, event.data.lastIndexOf("]"));
}
</script>
</body>
</html>