在Rack应用程序中使用Grape-Api gem获取绝对URL

时间:2014-08-27 15:45:38

标签: ruby-on-rails ruby rack grape grape-api

我正在使用grape gem创建API,在我的一项服务中,我想要检索完整的网址。例如,如果用户请求:

api.myapp.com/android/users.json

我希望能够检索api.myapp.com/android/users.json或至少/android/users.json

class MyApp::API::Users < Grape::API

    resource :users do

        get do
            request.original_url
            # stuff ...
        end
    end
end

我在Rails中尝试了我所知道的,但现在它是Grape并且它不起作用:

  "error": "undefined method `original_url' for #<Grape::Request:0x00000005a78c08>"

2 个答案:

答案 0 :(得分:4)

我想在我自己的API中做同样的事情(生成绝对URI),经过大量的研究,我最终放弃了。令人惊讶的是,我找不到从Grape获取您正在寻找的信息的好方法 - 例如,您不能指定资源在特定路径上“挂载”,然后在以后检索该信息。

我在此期间做的是在每个请求开始时将基本URL(方案,主机名和端口)保存在全局变量中:

before do
  # Save the base URL of the request, used by resources to build
  # their canonical URI
  Resources::base_url = request.base_url
end

然后,在每个资源代表中,使用硬编码路径信息“手动”组装URI:

link :self do
  RideYork::API::Resources::base_url +
    "/resources/agencies/#{represented.id}" if represented.id
end

这是一个可怕的黑客,但我不知道更好的解决方案。

答案 1 :(得分:3)

Grape::Request只是Rack::Request。看起来Rack::Request#url方法,您可以尝试。