Вы должны рассмотреть возможность использования 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
It начинает поток, отправляя ответ с заголовком 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, который, по желанию клиента, работает определенную задачу в фон, который может занять немного времени, прежде чем он возвращает результаты клиенту.
Это один из ключевых вариантов использования серверных событий, предназначенных для использования.
Есть ли способ обновить клиент информацией о ходе выполнения этой задачи ?
Да, вы можете сделать это с помощью событий, отправленных сервером.
Там в обработчик прогресс XMLHttpRequest
, но если я понимаю правильно он используется только для процесса передачи данных.
Право. XHR не может получить информацию о ходе на все, что происходит на сервере, до ответа.
В моем приложении, пример потока заключается в следующем:
Является ли эта часть спецификации HTTP?
Это не часть спецификации HTTP (хотя HTTP/2 имеет несколько связанных функций).
Или мне нужно что-то другое (WebSocket ..?)
Вам не нужно WebSockets для этого. WebSockets отлично подходят для случая, когда вам нужна реальная двусторонняя полнодуплексная связь между клиентом и сервером - например, чат-приложение в режиме реального времени.
Но вместо этого вариант использования, описанный в вопросе, содержит только односторонняя связь обновлений с сервера клиенту. И это именно то, для чего предназначены серверные события.