【发布时间】:2015-05-07 16:15:01
【问题描述】:
我正在用 Sinatra 编写一个 API 模拟服务器,如下所示
require 'sinatra/base'
class APIMockServer < Sinatra::Base
post '/mock' do
_body = params[:body]
_status = params[:status] || 200
APIMockServer.send params[:method], params[:action] do
body _body
status _status
end
'success'
end
run! if app_file == $0
end
我向/mock发送post请求,Sinatra App会动态生成路由。
require 'restclient'
RestClient.post(
'127.0.0.1:4567/mock',
{
action: '/sayhi',
method: 'get',
body: 'hello world'
}
)
到目前为止,它按预期工作,但是当我发送另一个具有相同action 的帖子请求时,它不会生效。
require 'restclient'
RestClient.post(
'127.0.0.1:4567/mock',
{
action: '/sayhi',
method: 'get',
body: 'hello world, hello Sinatra' # the body is changing
}
)
我猜是因为我定义了两条同名的路由,所以 Sinatra 采用第一个匹配的路由来响应。如何弃用第一个,以便最后一个生效?
【问题讨论】:
-
我只看到这里定义了一条路线。第二条路线出现在哪里?
-
由
APIMockServer.send params[:method], params[:action]定义,在本例中等于get('/sayhi') { 'hello world' }。 -
这是一种奇怪的做法。您可能需要为您的服务器设置“记录”模式,以及稍后可以使用的“回放”。这样可以避免这里的冲突。这是VCR使用的模型。
-
感谢您的重播,我会考虑您推荐的宝石。但如果我的问题得到解决,我会感觉更好 =)