我有一个http服务器,在客户端请求时,在后台运行某个任务,这可能需要一些时间才能将结果返回给客户端。
有没有办法使用该特定后台任务的进度信息更新客户端?
有XMLHttpRequest的进度处理程序,但如果我理解正确,它只用于数据传输进度。
在我的应用程序中,流程的一个例子是:
这是http规范的一部分吗?或者我还需要别的东西(websocket ..?)
谢谢!
答案 0 :(得分: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服务器,根据客户端请求,运行某个任务 在返回之前可能需要一些时间的背景 结果给客户。
这是服务器发送事件的主要用例之一。
有没有办法更新客户端的进度信息 具体的背景任务?
是的,您可以使用服务器发送的事件来执行此操作。
XMLHttpRequest
的进度处理程序,但如果我理解的话 这是正确的,它只用于数据传输进度。
右。 XHR无法获得有关服务器响应之前发生的任何事情的进度信息。
在我的应用程序中,流程的一个例子是:
这是http规范的一部分吗?
它不是HTTP规范的一部分(尽管HTTP / 2具有一些相关的功能)。
或者我还需要别的东西(websocket ..?)
您不需要WebSockets。 WebSockets非常适合客户端和服务器之间需要真正的双向全双工通信的情况 - 例如,实时聊天应用程序。
但问题中描述的用例只是需要从服务器到客户端的单向通信。这正是服务器发送的事件的用途。