2013-05-06 12 views
3

在末日,如果我創建一個簡單的端點,例如:處理405在西納特拉

post '/users' do 
    'posted' 
end 

curl -v -X GET http://localhost:8080/users返回404,當我想到一個405

我已經通過的文件看上去但不發現了什麼。在深入研究源代碼之前,有沒有人知道如何處理並返回Sinatra中的405?有點像沒有找到的方法:

not_found do 
    'Not found - ' + request.path 
end 

回答

1

看起來它不是可能沒有重複自己很多。從通過Sinatra的源代碼看,路線的哈希具有動詞爲關鍵:https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1513

然後,它使用動詞查找路線: https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L943

哪一項不是很理想,我會考慮的一個弱點/在框架中的錯誤,因爲當不允許動詞時拋出405是標準的HTTP Spec。

我可能會提出一個問題,看看貢獻者說什麼。理想情況下,它會首先通過url存儲路由,然後檢查適當的動詞是否可以針對給定的url執行。這將使得像405一樣標準化處理更容易。

事實上,我發現在GitHub上提高了上述問題: https://github.com/sinatra/sinatra/issues/24 由於更接近底部所提及的,這不是目前的處理和東西,他們可以爲V2.0的所有其他動詞,意上工作

3

你有404,因爲sinatra無法找到獲取路線/用戶。如果你想返回一個自定義錯誤,你可以看Halt

拋出一個錯誤

的你可以獲取返回405 /用戶是這樣的:

get "/users" do 
    halt 405 
end 

漁獲多個HTTP動詞一次您可以使用multi route

require 'sinatra' 
require "sinatra/multi_route" 
route :get, :post, '/foo' do 
    # "GET" or "POST" 
    p request.env["REQUEST_METHOD"] 
end 

# Or for module-style applications 
class MyApp < Sinatra::Base 
    register Sinatra::MultiRoute 
    route :get, :post, '/foo' do 
    # ... 
    end 
end 

source

手柄錯誤

如果你想處理在西納特拉錯誤代碼可以爲404錯誤簡單做:

not_found do 
    'This is nowhere to be found.' 
end 

在你的情況處理405錯誤:

error 405 do 
    'Access forbidden' 
end 
+1

所以我需要寫一個「暫停405」?這聽起來不像一個優雅的解決方案。從技術上講,資源/路線存在,只是動詞是錯誤的。這就是爲什麼我期望405.爲405的實現一個捕獲所有解決方案必須有一個更好的方法。 – Bealer 2013-05-07 09:19:27

+0

我認爲多路線是您的問題的優雅解決方案。 – 2013-05-07 10:06:56

+0

嗯,仍然沒那麼優雅。這意味着我必須爲每個端點使用route:get,:put:delete,:patch,:options,:and_so_on來玷污我的代碼。但總比沒有好,儘管我寧願看看問題的核心問題是否可以解決。 – Bealer 2013-05-07 13:12:12