首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby on Sinatra:基于参数模拟请求

Ruby on Sinatra:基于参数模拟请求
EN

Stack Overflow用户
提问于 2015-03-23 07:34:43
回答 4查看 302关注 0票数 3

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

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

代码语言:javascript
复制
GET /{command}

参数:命令和文本

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

在我的例子中,params:text实际上是由空格分隔的一系列命令。我想要达到的目标是,例如:如果params:text=“公司财务”

然后,我希望API将请求解释为对/{command}/corporate/finance的GET请求,而不是使用字符串作为包含请求其余部分的参数的请求/{command}。

我能做到这一点吗?在社交平台的初始请求方面,没有什么可以改变的。

编辑:我认为一个更好的方法来解释我想要达到的目标是:

代码语言:javascript
复制
GET /list?text=corporate finance

应该到达与

代码语言:javascript
复制
GET /list/corporate/finance

这不应影响来自社交平台的初始GET请求,因为它希望包含文本的响应显示给用户。是否有一种整洁的、最佳的方法来做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-23 13:49:39

解决办法是用电话!方法。

我使用一个正则表达式来拦截与/something匹配的没有进一步参数的调用(即/something/什么的)。我认为这一步可以做得更优雅一些。

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

代码语言:javascript
复制
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等等。

票数 0
EN

Stack Overflow用户

发布于 2015-03-23 07:46:35

代码语言:javascript
复制
get "/" do {
  text = params[:text].split.join "/"
  redirect "#{params[:command]}/#{text}"
end

也许能起作用。但没查过。

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

代码语言:javascript
复制
get "/:command" do {
  text = params[:text].split.join "/"
  redirect "#{params[:command]}/#{text}"
}

实现这一点有许多可能的方法。您应该检查sinatra文档(https://github.com/sinatra/sinatra)的路由部分。

票数 1
EN

Stack Overflow用户

发布于 2015-03-23 09:22:12

three的回答应该能做到这一点,并且为了绕过每个请求都会调用过滤器这一事实,这样的条件应该可以做到:

代码语言:javascript
复制
before do
  if params[:text]
    sub_commands = params[:text].split.join "/"
    redirect "#{params[:command]}/#{sub_commands}"
  end
end

我已经在一个演示应用程序中对它进行了测试,它似乎运行得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29205159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档