我目前正在开发基于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请求,因为它期望包含文本的响应显示给用户。这样做是否有一种巧妙的最佳实践方式?
答案 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 等。