OpenURI::与 Rails 一起打开无法从本地主机加载 JSON



我有这么明显的控制器代码:

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#output 中的外部服务器加载 JSON 时,它也可以正常工作。

但是所有的东西 - Rails,OpenURI和localhost - 破坏了我的代码。为什么?

Webrick(你在开发环境中使用的Web服务器)是用纯Ruby编写的,一次只能处理一个请求。因此,您的请求(来自控制器)等待当前请求完成。

这会产生死锁,因此您的请求挂起,当然您不会遇到其他服务器/源的问题。

溶液

Webrick的替代方案是薄的,它可以运行concuren请求,有关更多信息和用法,请在GitHub上查看其自述文件。

如何

为您的宝石文件添加薄型

gem 'thin'

启动服务器

bundle exec thin start --threaded 

最新更新