Как передать параметры POST с помощью HTML SSE?

У меня есть блок кода, который использует HTML 5 SSE — объект EventSource, который позволяет php-скрипту отправлять обновления на веб-страницу. Однако меня также интересует передача параметров сценарию. Как я могу это сделать?

Вот код:

if(typeof(EventSource) !== "undefined")
    {
        var source = new EventSource("get_message.php");
        source.onmessage=function(event)
        {
            document.getElementById("message-window").innerHTML+=event.data + "<br>";
        };
    }
else
    {   
        document.getElementById("message-window").innerHTML="Sorry, your browser does not support server-sent events...";
     }

Самое близкое, что я могу придумать, это использовать AJAX, как в

$.post("get_message.php", {largest_id: 30}, function(data, status){ some function });

Однако я не уверен, как написать jQuery для этого?


person blazonix    schedule 23.05.2014    source источник
comment
Вам действительно нужно тело POST? Или будет достаточно параметров GET (new EventSource("get_message.php?largest_id=30"))?   -  person Bergi    schedule 23.05.2014
comment
@Bergi Берги Я думаю, что параметры GET имеют длину верхнего символа? Мне нужен POST без потолка char   -  person blazonix    schedule 23.05.2014
comment
Ну, это зависит от возможностей вашего веб-сервера и некоторых особенностей браузера. Но каков ваш вариант использования? Вы загружаете файл в местоположение потока?   -  person Bergi    schedule 23.05.2014
comment
@Bergi Это на самом деле для приложения чата - я отправляю содержимое чата на сервер в качестве параметра - я думаю, что это излишество ... но я не знаю, как еще отправить данные   -  person blazonix    schedule 23.05.2014
comment
Для чата (с двунаправленными асинхронными сообщениями) SSE — неподходящий инструмент. Используйте веб-сокеты.   -  person Bergi    schedule 23.05.2014
comment
@Bergi Я уже реализовал некоторый исходный код с SSE, и, похоже, он работает - вы имеете в виду, что SSE менее подходит, чем веб-сокеты? Если да, то почему?   -  person blazonix    schedule 23.05.2014
comment
Ну, потому что вы не можете отправлять сообщения — вы можете только получать события. Или, может быть, покажите нам свой код для чата?   -  person Bergi    schedule 23.05.2014
comment
Хм, я раньше не программировал с помощью WebSockets, и для отправки я просто использовал функцию $.post(), ajax jquery, так что все в порядке, хотя интерфейс не такой унифицированный, как WebSockets - посмотрю в следующий раз хотя время. :)   -  person blazonix    schedule 23.05.2014


Ответы (3)


EventSource API не поддерживает метод POST, однако это не означает, что вы не можете использовать SSE с POST. Вы просто не можете использовать EventSource API.
Однако существуют альтернативные реализации. Одним из примеров является sse.js, который позволяет вам указать полезную нагрузку, а также заголовки, если вам нужно. sse.js должен быть заменой EventSource, например:

var source = new SSE("get_message.php");
source.onmessage=function(event)
{
    document.getElementById("message-window").innerHTML+=event.data + "<br>";
};

Чтобы использовать метод POST, вам просто нужно указать полезную нагрузку, например:

var source = new SSE("get_message.php", {payload: 'Hello World'});

И, поскольку это полностью совместимый полифилл, вы, вероятно, можете сделать это:

EventSource = SSE;
var source = new EventSource("get_message.php", {payload: 'Hello World'});
source.onmessage=function(event)
{
    document.getElementById("message-window").innerHTML+=event.data + "<br>";
};
person mjs    schedule 27.02.2019

@blazonix, вы должны различать отправку и получение при использовании SSE.

EventSource предназначен только для получения данных с сервера. Для отправки данных на сервер необходимо использовать обычный запрос AJAX.

В моей библиотеке я делаю возможным повторное использование одного и того же пути для отправки и получения, но я различаю, что хочет сделать вызывающий абонент, на основе заголовка Accept:

  • Accept: text/event-stream — это браузер, который хочет инициировать подключение к потоку событий
  • Принять: любой другой тип - это обычный не/AJAX-вызов GET или POST

Пример кода Java: GitHub

person MeTTeO    schedule 28.08.2016

Это так просто.

$.post('your_url.php?your_parametre1=' + your_value1 + '&your_parametre2_likewise=' + your_value, function(data) {
alert(data); // whatever you echo from php file as a identifier of success or error.
});
person Sabby Subhankar Bar    schedule 23.05.2014
comment
Я думал, что это только для GET-запросов? Что, если я хочу обрабатывать POST-запросы? Параметры, скорее всего, превысят длину верхнего символа, которую навязывают параметры GET, я полагаю? - person blazonix; 23.05.2014