OpenURI ::与Rails一起打开无法从localhost加载JSON

时间:2015-01-06 23:36:23

标签: 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(JSON.parse(data))
    end
end

一个控制器的动作返回JSON,另一个动作下载并输出。

但是这段代码没有正常工作:Foobar #get返回JSON,但open(...)无法加载JSON(服务器没有响应)。

但是,当我尝试以这种方式加载和解析JSON时,它可以正常工作。 当我尝试从Foobar#输出中的外部服务器加载JSON时,它也能正常工作。

但是一起--Rails,OpenURI和localhost - 打破了我的代码。为什么呢?

1 个答案:

答案 0 :(得分:0)

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

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

解决方案

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

如何

将精简版添加到Gemfile

gem 'thin'

启动服务器

bundle exec thin start --threaded