http自定义进度反馈给客户

时间:2017-02-08 14:03:19

标签: javascript http server xmlhttprequest

我有一个http服务器,在客户端请求时,在后台运行某个任务,这可能需要一些时间才能将结果返回给客户端。

有没有办法使用该特定后台任务的进度信息更新客户端?

有XMLHttpRequest的进度处理程序,但如果我理解正确,它只用于数据传输进度。

在我的应用程序中,流程的一个例子是:

  1. 客户端发送GET请求。
  2. 服务器执行可能需要时间的事情。如何更新客户端的事情进展?
  3. 服务器向客户端返回响应。根据数据大小,可能还需要时间。 XMLHttpRequest进度事件可以在这里使用。
  4. 这是http规范的一部分吗?或者我还需要别的东西(websocket ..?)

    谢谢!

1 个答案:

答案 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非常适合客户端和服务器之间需要真正的双向全双工通信的情况 - 例如,实时聊天应用程序。

但问题中描述的用例只是需要从服务器到客户端的单向通信。这正是服务器发送的事件的用途。