web-dev-qa-db-ja.com

サーバー送信イベントはpostメソッドでパラメーターを渡します

Html5サーバー送信イベントを使用しています。サーバー側はJavaサーブレットです。サーバーに渡したいjson配列データがあります。

_var source = new EventSource("../GetPointVal?id=100&jsondata=" + JSON.stringify(data));
_

配列サイズが小さい場合、サーバー側はクエリ文字列を取得できます。ただし、配列サイズが大きい場合。 (おそらく数千文字以上)、サーバーはクエリ文字列を取得できません。クエリ文字列の長さの制限を回避できるjson配列をサーバーに渡すために、POST new EventSource(...)のメソッド)を使用することは可能ですか?

20
Tom Cheng

いいえ、SSE標準ではPOSTは許可されていません。

(私が知ることができる限り、技術的な理由はありません-デザイナーがユースケースを見たことがないだけだったと思います:それは大きなデータだけではありませんが、カスタム認証スキームを実行したい場合、 GETデータにパスワードを入れないセキュリティ上の理由。)

XMLHttpRequest(つまりAJAX)はPOSTを許可するため、1つのオプションは古いlong-poll/cometメソッドに戻ることです。 (私の本 HTML5 SSEを使用したデータプッシュアプ​​リ では、これを行う方法についてかなり詳しく説明しています。)

別のアプローチは、すべてのデータを事前にPOSTしてHttpSessionに格納し、SSEプロセスを呼び出すことです。セッションデータ(SSEはCookieをサポートしているため、JSESSIONID Cookieは正常に機能します。)

追伸 standard は明示的にPOSTは使用できません)とは言いませんが、XMLHttpRequestとは異なり、使用するhttpメソッドを指定するパラメーターはありません。投稿するデータを指定する方法はありません。

22
Darren Cook

EventSource AP​​Iを使用してこれを行うことはできませんが、サーバーがPOSTリクエストに対して実装できないという技術的な理由はありません。トリックはクライアントにsendリクエスト。例 この回答ではsse.jsについて説明しますEventSourceの代わりに使用します。

3
mjs

このシナリオでイベントソースを機能させるのは、ユーザーがジョブを投稿してジョブトークンを受信できるようにするエンドポイントと、投稿者が結果をリッスンできるようにするエンドポイントを伴う、あまりにも多くの労力です。

サーバーは、トークンと、トークンに関連付けられたユニキャストストリームを格納する必要があります。これにより、1つのテキスト/イベントストリームのみがサブスクライブできます。

このユニキャストストリームは、ストリーミングデータがアップロードされたとき、または接続が切断されたとき、またはユーザーがその間にシステムに対して他の要求を行ったとき、またはユーザーのセッションが期限切れになったときに破棄する必要があります。

より良いアイデアは、ユーザーが情報を投稿し、結果を受け取ることができるWebSocket接続を使用することです。

0
nurettin

または、別の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>
0
jimver04