我正在编写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
发送帖子请求,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将第一个匹配的路线作为响应。如何弃用第一个,以便最后一个生效?
答案 0 :(得分:1)
这是一个有趣的应用程序。它是一个元编程API。
我认为问题在于,一旦定义了路线,就不会重新定义路线。
所以,也许您需要使用
之类的东西删除路线remove_method params[:method]
或
APIMockServer.remove_method params[:method], params[:action]
我不确定Sinatra如何管理定义的路线,但您可能想要研究一下。也许How do you remove a route from Sinatra?会有所帮助。