【问题标题】:Get absolute URL with Grape-Api gem on Rack app在 Rack 应用程序上使用 Grape-Api gem 获取绝对 URL
【发布时间】:2014-08-27 15:45:38
【问题描述】:

我正在使用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>"

【问题讨论】:

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


    【解决方案1】:

    我想在自己的 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
    

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

    【讨论】:

    • 我理解你的建议,但它不适合我的情况。我有两个应用程序(一个在 android 上,一个在 ios 上),我希望他们在 api.myapp.com/android/users.jsonapi.myapp.com/iphone/users.json 上发送请求,以便在服务器端知道正在请求哪种类型的设备。你有什么想法吗?
    • 嗯,通常您会使用 HTTP 标头来识别正在连接的客户端类型 - 拥有多个指向同一底层资源的不同表示的 URI 被认为是错误的形式。您是否考虑过为此目的使用 User-Agent 标头?
    • 当我这样做的时候。我可能会像你说的那样做。
    【解决方案2】:

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

    【讨论】:

    • 你几乎是对的,但是当我输入 http://api2.myapp.com/android/users.json 时它返回 http://api2.myapp.com/users.json
    • 好吧,文档说它“尝试”重新创建该 URL,因此必须丢失一些信息......你是否在像 nginx 之类的代理之后?你可以试试#headers 方法,看看里面有没有有用的东西。
    • headers 方法仅此而已。我使用 nginx,也许我的重写做错了? location /android { rewrite /android/(.*) /$1 break; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://api2; }
    • 这正是你所问的:/android/users.json 被重写为 /users.json
    • 是的,但我想得到用户请求 /android 或 /something 的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多