Ruby on Sinatra:根据参数模仿请求

时间:2015-03-23 07:34:44

标签: ruby get sinatra url-parameters

我目前正在开发基于Sinatra的Ruby API。此API主要接收来自支持外部API集成的现有社交平台的GET请求。

社交平台以下列格式触发GET请求(仅显示相关参数):

GET /{command}

参数:命令文本

其中text是用户输入的字符串。

就我而言,params [:text]实际上是一系列由空格分隔的命令。我想要实现的目标是,例如:如果params [:text] ="公司财务"

然后我希望我的API将请求解释为GET请求 / {}命令/企业/财务 而不是使用字符串作为包含请求其余部分的参数来请求/ {command}。

这可以在我身边实现吗?从社交平台的初始请求来看,没有任何改变。

编辑:我认为解释我想要实现的目标的更好方法如下:

GET /list?text=corporate finance

应该与

达到相同的端点/路线
GET /list/corporate/finance

这不得影响来自社交平台的初始GET请求,因为它期望包含文本的响应显示给用户。这样做是否有一种巧妙的最佳实践方式?

4 个答案:

答案 0 :(得分:1)

get "/" do {
  text = params[:text].split.join "/"
  redirect "#{params[:command]}/#{text}"
end

可能会成功。虽然没有检查。

编辑:好的,之前的过滤器是愚蠢的。基本上你也可以路由到" /"然后重定向。或者,甚至更好:

get "/:command" do {
  text = params[:text].split.join "/"
  redirect "#{params[:command]}/#{text}"
}

有很多可能的方法来实现这一目标。您应该查看sinatra文档(https://github.com/sinatra/sinatra

的路线部分

答案 1 :(得分:0)

的答案应该可以解决这个问题,并且为了解决每个请求都会调用过滤器的事实,像这样的条件应该这样做:

before do
  if params[:text]
    sub_commands = params[:text].split.join "/"
    redirect "#{params[:command]}/#{sub_commands}"
  end
end

我已经在演示应用程序中对其进行了测试,似乎工作正常。

答案 2 :(得分:0)

对不起,我完全误解了你的问题,所以我用这个替换了我的答案:

require 'sinatra'

get '/list/?*' do
  "yep"
end
像这样,以下路线都是相同的 您需要为每个命令添加例程或用*替换命令,并根据具体情况依赖您的输出。 用户输入的参数可以通过参数哈希来引用。

http://localhost:4567/list
http://localhost:4567/list/corporate/finance
http://localhost:4567/list?text=corporate/finance

答案 3 :(得分:0)

解决方案是使用通话!方法

我使用正则表达式来拦截与 / something 匹配的调用而没有其他参数(即/某些/其他东西)。我认为这一步可以更优雅地完成。

从那里,我分开了我的命令:

get %r{^\/\w+$} do
  params[:text] ? sub_commands="/"+params[:text].split.join("/") : sub_commands=""
  status, headers, body = call! env.merge("PATH_INFO" => "/#{params[:command]}#{sub_commands}")
  [status, headers, body]
end

这实现了我所需要的,因为它激活了正确的端点,就好像URL是通常的格式,即 / command / subcommand1 / subcommand2 等。