Ruby on rails OpenURI::open with Rails无法从localhost加载JSON
我有这样明显的控制器代码:Ruby on rails OpenURI::open with Rails无法从localhost加载JSON,ruby-on-rails,ruby,open-uri,Ruby On Rails,Ruby,Open Uri,我有这样明显的控制器代码: require "json" require "open-uri" class FoobarController < ApplicationController def get render json: { foo: 1, bar: 2 } end def output data = open("http://localhost:3000/foobar/get").read puts(J
require "json"
require "open-uri"
class FoobarController < ApplicationController
def get
render json: { foo: 1, bar: 2 }
end
def output
data = open("http://localhost:3000/foobar/get").read
puts(JSON.parse(data))
end
end
一个控制器的动作返回JSON,另一个动作下载并输出JSON
但是这段代码不能正常工作:Foobarget返回JSON,但是open。。。无法加载JSON服务器不响应
但是,尽管如此,当我尝试以这种方式加载和解析JSON时,它工作正常。
当我尝试在Foobaroutput中从外部服务器加载JSON时,它也能正常工作
但是,Rails、OpenURI和localhost这三个元素一起破坏了我的代码。为什么?development env中使用的Webrick web服务器是用纯ruby编写的,一次只能处理一个请求。因此,来自控制器的请求等待当前请求完成 这会产生死锁,因此您的请求会挂起,当然其他服务器/源不会出现这些问题 解决方案 Webrick的替代品是,它可以运行concuren请求,有关更多信息和用法,请在GitHub上查看其自述文件 怎样 将精简添加到您的文件中
gem 'thin'
启动服务器
bundle exec thin start --threaded
是的,当您编辑答案时,我安装了thin。不幸的是,它没有解决问题。您是否尝试过使用option-threaded在线程中调用Rack应用程序?现在我尝试了瘦启动线程。很抱歉,但问题仍然存在。很抱歉听到这个消息,顺便说一句,如果操作在同一个控制器中,那么在操作之间有实际请求似乎是一种反模式,也许您可以引入一些抽象层,创建两个操作都重新调整的有效负载。事实上,在我的常规项目操作中,它返回JSON和操作,解析它的,被放置在不同的控制器中。在这个测试应用程序中,为了简单起见,我将动作放在一个控制器中。但即使在这种情况下,这个问题也是实际存在的。