Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用Grape Api gem on Rack应用程序获取绝对URL_Ruby On Rails_Ruby_Rack_Grape_Grape Api - Fatal编程技术网

Ruby on rails 使用Grape Api gem on Rack应用程序获取绝对URL

Ruby on rails 使用Grape Api gem on Rack应用程序获取绝对URL,ruby-on-rails,ruby,rack,grape,grape-api,Ruby On Rails,Ruby,Rack,Grape,Grape Api,我正在做一个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_ur

我正在做一个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
classmyapp::API::Users
我尝试了我从Rails知道的东西,但现在它是葡萄色的,不起作用:

  "error": "undefined method `original_url' for #<Grape::Request:0x00000005a78c08>"
“错误”:“未定义#的方法`original_url'”

只是一个例子。看起来,
Rack::Request
有一种方法可以尝试。

我想在自己的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
然后,在每个资源representer中,使用硬编码路径信息“手动”组装URI:

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

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

你几乎是对的,但它返回
http://api2.myapp.com/users.json
当我键入
http://api2.myapp.com/android/users.json
文档说它“试图”重新创建该URL,因此某些信息一定会丢失。。。你是否支持nginx之类的代理?你可以试试
#headers
方法,看看里面有没有什么有用的东西。用
headers
方法就没什么了。我使用了nginx,也许我的重写错误了<代码>位置/android{rewrite/android/(.*)/$1中断;代理设置头X转发$proxy\U添加\U X\U转发\U For;代理设置头主机$http\U主机;代理重定向关闭;代理传递http://api2; }
这正是您所问的:/android/users.json被重写为/users.jsonyes,但我想得到用户请求的内容/android或/something我理解您的建议,但它不适合我的情况。我有两个应用程序(一个在android上,一个在ios上),我希望它们在
api.myapp.com/android/users.json
api.myapp.com/iphone/users.json上发送请求,以便在服务器端知道请求的设备类型。你知道吗?嗯,通常你会使用HTTP头来识别连接的是哪种类型的客户端。如果有多个URI指向同一底层资源的不同表示,这被认为是不好的形式。你有没有考虑过为此目的使用标题?当我考虑过的时候。我可能会照你说的做。