我目前正在开发一个基于Sinatra的Ruby。该API主要接收来自支持外部API集成的现有社交平台的GET请求。
社交平台以以下格式发出GET请求(仅显示相关参数):
GET /{command}参数:命令和文本
其中文本是用户输入的字符串。
在我的例子中,params:text实际上是由空格分隔的一系列命令。我想要达到的目标是,例如:如果params:text=“公司财务”
然后,我希望API将请求解释为对/{command}/corporate/finance的GET请求,而不是使用字符串作为包含请求其余部分的参数的请求/{command}。
我能做到这一点吗?在社交平台的初始请求方面,没有什么可以改变的。
编辑:我认为一个更好的方法来解释我想要达到的目标是:
GET /list?text=corporate finance应该到达与
GET /list/corporate/finance这不应影响来自社交平台的初始GET请求,因为它希望包含文本的响应显示给用户。是否有一种整洁的、最佳的方法来做到这一点?
发布于 2015-03-23 13:49:39
解决办法是用电话!方法。
我使用一个正则表达式来拦截与/something匹配的没有进一步参数的调用(即/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是按通常的格式输入的,即/命令/子命令1/子命令2等等。
发布于 2015-03-23 07:46:35
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)的路由部分。
发布于 2015-03-23 09:22:12
three的回答应该能做到这一点,并且为了绕过每个请求都会调用过滤器这一事实,这样的条件应该可以做到:
before do
if params[:text]
sub_commands = params[:text].split.join "/"
redirect "#{params[:command]}/#{sub_commands}"
end
end我已经在一个演示应用程序中对它进行了测试,它似乎运行得很好。
https://stackoverflow.com/questions/29205159
复制相似问题