我有这么明显的控制器代码:
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,另一个动作下载并输出。
但是这段代码没有正常工作:Foobar #get返回JSON,但open(...)无法加载JSON(服务器没有响应)。
但是,当我尝试以这种方式加载和解析JSON时,它可以正常工作。 当我尝试从Foobar#输出中的外部服务器加载JSON时,它也能正常工作。
但是一起--Rails,OpenURI和localhost - 打破了我的代码。为什么呢?
答案 0 :(得分:0)
Webrick(您在开发环境中使用的Web服务器)是用纯ruby编写的,一次只能处理一个请求。因此,您的请求(来自控制器)等待当前的请求完成。
这会产生死锁,因此您的请求会挂起,当然您没有其他服务器/来源的问题。
Webrick的替代方案是thin,它可以运行concuren请求,有关更多信息和用法,请查看其在GitHub上的自述文件。
将精简版添加到Gemfile
gem 'thin'
启动服务器
bundle exec thin start --threaded