2015-05-07 44 views
1

我正在寫的一西納特拉API模擬服務器,它看起來像下面如何在Sinatra應用程序中棄用路線?

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時,西納特拉應用程序將動態生成的路徑。

require 'restclient' 

RestClient.post(
    '127.0.0.1:4567/mock', 
    { 
     action: '/sayhi', 
     method: 'get', 
     body: 'hello world' 
    } 
) 

到目前爲止,它工作正常,但是當我發送帶有相同action另一個POST請求,但不生效。

require 'restclient' 

RestClient.post(
    '127.0.0.1:4567/mock', 
    { 
     action: '/sayhi', 
     method: 'get', 
     body: 'hello world, hello Sinatra' # the body is changing 
    } 
) 

我猜是因爲我定義了兩個路線名稱相同,所以西納特拉採取的第一個匹配的一個響應。我怎樣才能棄用第一個,以便最後一個可以生效?

+0

我只看到這裏定義的一條路線。第二條路線在哪裏顯示? – tadman

+0

在本例中,它由'APIMockServer.send params [:method],params [:action]'定義,它等於'get('/ sayhi'){'hello world'}。 – PieceHealth

+0

這是一個奇怪的方式來做到這一點。您可能需要爲您的服務器設置「錄製」模式,並且稍後可以使用「播放」。這將避免這裏的衝突。這是[VCR]使用的模型(https://github.com/vcr/vcr)。 – tadman

回答

1

這是一個有趣的應用程序。這是一個元編程API。

我認爲問題在於一旦定義了路由,它就不會被重新定義。

所以,也許你需要刪除像

remove_method params[:method] 

APIMockServer.remove_method params[:method], params[:action] 

我不知道末日如何管理定義的路由使用的東西的路線,但你可能想看看那。也許How do you remove a route from Sinatra?會有一些幫助。

相關問題