我正在使用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>"
答案 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
方法,您可以尝试。