Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails如何解析文本/事件流?_Ruby On Rails_Ruby_Ruby On Rails 4_Eventmachine - Fatal编程技术网

Ruby on rails Rails如何解析文本/事件流?

Ruby on rails Rails如何解析文本/事件流?,ruby-on-rails,ruby,ruby-on-rails-4,eventmachine,Ruby On Rails,Ruby,Ruby On Rails 4,Eventmachine,我有一个API url,它是一个内容类型为:text/event stream的数据流 怎样才能听到这条流呢?是否要订阅每个事件以打印数据?我尝试过使用ruby库em eventsource 我的test.rb文件: require "em-eventsource" EM.run do source = EventMachine::EventSource.new("my_api_url_goes_here") source.message do |message| puts "n

我有一个API url,它是一个内容类型为:
text/event stream
的数据流

怎样才能听到这条流呢?是否要订阅每个事件以打印数据?我尝试过使用ruby库
em eventsource

我的
test.rb
文件:

require "em-eventsource"
EM.run do
  source = EventMachine::EventSource.new("my_api_url_goes_here")
  source.message do |message|
    puts "new message #{message}"
  end
  source.start 
end

当我访问api url时,我可以看到每秒更新的数据。但是当我在终端中运行ruby文件时,它不会打印任何数据/消息

设置一个计时器来检查
source.ready\u state
,它似乎由于某种原因没有连接到api

编辑:您的问题似乎出在https的SNI中,当前的eventmachine版本不支持该SNI,因此在连接eventsource时,会尝试连接到api机器上的默认虚拟主机,而不是api所在的虚拟主机,因此处于连接状态

尝试使用master branch的eventmachine,它已经声明支持SNI,将在1.2.0中发布:

gem 'eventmachine', github:'eventmachine/eventmachine'

我使用了EventMachine http库

0
正在连接,这意味着eventsource失败或尚未连接,默认情况下,它将在3秒内重试常规http或https?尝试使用
curl-v
访问它,它是
https
我没有收到任何错误消息。刚刚尝试了curl,我就可以看到所有的流式数据。你使用什么版本的EventMachine?Api服务器可能(而且很可能确实)使用SNI,但对它的支持尚未在gem中发布,仅在主分支
em eventsource(0.2.1)em http请求(1.1.2)em socksify(0.3.1,0.3.0)erubis(2.7.0)eventmachine(1.0.8,1.0.7)中发布。
require 'eventmachine'
require 'em-http'
require 'json'

http = EM::HttpRequest.new("api_url", :keepalive => true, :connect_timeout => 0, :inactivity_timeout => 0)

EventMachine.run do

  s = http.get({'accept' => 'application/json'})
  s.stream do |data|
    puts data
  end

end