Sinatra Streaming Responses

2023-12-20 15:43 更新

有時候,想要在開始發(fā)送數(shù)據時依然生成一些響應體??紤]一個極端的例子,在客戶端關閉連接之前,一直發(fā)送數(shù)據??梢允褂昧鬏o助方法來避免自己創(chuàng)建包裝方法。

get '/' do
  stream do |out|
    out << "It's gonna be legen -\n"
    sleep 0.5
    out << " (wait for it) \n"
    sleep 1
    out << "- dary!\n"
  end
end

可以使用 stream 方法實現(xiàn)流式 API,服務器發(fā)送事件以及用作 WebSocket 的基礎。該方法同樣也可用來提高速度,如果只有部分內容依賴緩慢的資源。

注意:流式行為,特別是并發(fā)請求的數(shù)據,高度依賴用來提供應用的 web 服務器。有些服務器,比如 WEBRick,根本不支持流。如果服務器不支持流,當傳遞給流的塊結束執(zhí)行時,響應體將會被立即返回。流并不是包治百病的萬金油。

如果可選的參數(shù)設置為?keep_open?, 不會自動對流對象調用 close 方法,而是允許在隨后的執(zhí)行流中手動關閉。這近對那些時間驅動的服務器 (Thin,Rainbows) 起作用,其他服務器依然會關閉流。

# long polling

set :server, :thin
connections = []

get '/subscribe' do
  # register a client's interest in server events
  stream(:keep_open) { |out| connections << out }

  # purge dead connections
  connections.reject!(&:closed?)

  # acknowledge
  "subscribed"
end

post '/message' do
  connections.each do |out|
    # notify client that a new message has arrived
    out << params[:message] << "\n"

    # indicate client to connect again
    out.close
  end

  # acknowledge
  "message received"
end


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號