【问题标题】:How do I use a Sinatra URL as parameter in route?如何在路由中使用 Sinatra URL 作为参数?
【发布时间】:2013-08-06 22:24:19
【问题描述】:

我正在使用 Sinatra 路由,如果可能的话,我想将普通的 HTTP 地址解释为路由中的参数:

url http://somesite/blog/archives   

路线在哪里:

/http://somesite/blog/archives 

代码是:

get '/:url' do |u|  
(some code dealing with url)

HTTP URL 中的各种“/”会造成问题。

我发现的解决方法是只传递上面示例中“somesite”表示的 URL 部分,然后使用:

get '/:url' do |u|
buildUrl = "http://#{u}/blog/archives"
(some code dealing with url)

有没有办法直接处理完整的URL?

【问题讨论】:

  • 你的最终目标是什么?
  • 网页抓取提供的网址:buildUrl。我使用 nokogiri 处理提供的页面。也许只是不使用 sinatra。

标签: ruby routes sinatra


【解决方案1】:

这不会像您指定的那样工作。正如您所注意到的,斜线会引起麻烦。您可以做的是将 URL 作为查询字符串参数而不是 URL 的一部分传递。

get '/example' do
  url = params[:url]
  # do code with url
end

然后你可以通过将数据发送到http://yoursite.com/example?url=http://example.com/blog/archives来抓取任何你想要的东西

【讨论】:

  • 注意:如果您正在抓取的网站也使用查询字符串,这将不起作用。
【解决方案2】:

你想要什么并不明显,但是,一般来说,Ruby 的内置 URI 类对于剥离 URL、修改它们,然后重建它们很有用。如果不够复杂,Addressable::URI gem 应该填补所有缺失的漏洞:

require 'uri'
param = '/http://somesite/blog/archives'
scheme, userinfo, host, port, registry, path, opaque, query, fragment = URI.split(param[1..-1])
=> ["http", nil, "somesite", nil, nil, "/blog/archives", nil, nil, nil]

【讨论】:

  • 我想要的是,作为 sinatra 路由的调用者,我传递了我想要解析的控制器中的 url(检查我原始问题中的解决方法)。这意味着路由被定义为 /:url 并且 url 本身必须从浏览器传递。问题是当浏览器拥有我希望被识别为参数的所有 http url 时,sinatra 无法将 / 与路由匹配。因此需要我使用的解决方法。我可以忍受它,但好的想法是非常受欢迎的。感谢您的回复
猜你喜欢
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多