2017-02-08 8 views
1

У меня есть http-сервер, который по запросу клиента запускает определенную задачу в фоновом режиме, которая может занять некоторое время, прежде чем она вернет результаты клиенту.http custom progress feedback для клиента

Есть ли способ обновить клиент информацией о ходе выполнения этой конкретной фоновой задачи?

Есть обработчик прогресса XMLHttpRequest, но если я правильно понимаю, он используется только для прогресса передачи данных.

В моем приложении, пример потока заключается в следующем:

  1. клиент посылает GET запрос.
  2. сервер делает то, что может занять время. Как обновить клиента от прогресса?
  3. сервер возвращает ответ клиенту. В зависимости от размера данных также может потребоваться время. Здесь можно использовать событие прогресса XMLHttpRequest.

Является ли эта часть спецификации http? Или мне нужно что-то еще (websocket ..?)

спасибо!

ответ

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 

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 отлично подходят для случая, когда вам нужна реальная двусторонняя полнодуплексная связь между клиентом и сервером - например, чат-приложение в режиме реального времени.

Но вместо этого вариант использования, описанный в вопросе, содержит только односторонняя связь обновлений с сервера клиенту. И это именно то, для чего предназначены серверные события.

 Смежные вопросы

  • Нет связанных вопросов^_^