2

我正在使用grape gem做一个 API ,在我的一项服务中我想检索完整的 URL。例如,如果用户确实请求:

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>"
4

2 回答 2

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

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

于 2014-08-27T16:34:25.233 回答
3

Grape::Request只是一个Rack::Request。看起来Rack::Request#url一种你可以尝试的方法。

于 2014-08-27T15:51:37.247 回答