3

在 Sinatra 中,如果我创建一个简单的端点,例如:

post '/users' do 
    'posted'
end

curl -v -X GET http://localhost:8080/users返回 404,而我期望 405。

我浏览了文档,但没有找到任何东西。在挖掘源代码之前,有人知道如何在 Sinatra 中处理和返回 405 吗?有点像 not found 方法:

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

2 回答 2

3

你得到一个 404,因为 sinatra 找不到获取路由 /users。如果您想返回自定义错误,您可以查看Halt

抛出错误

您可以像这样在 get /users 上返回 405:

get "/users" do
    halt 405
end

要一次捕获多个 http 动词,您可以使用多路由

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

资源

处理错误

如果你想在 sinatra 中处理错误代码,你可以简单地处理 404 错误:

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

在您的情况下处理 405 错误:

error 405 do
  'Access forbidden'
end
于 2013-05-07T05:32:48.590 回答
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 规范。

我可能会提出一个问题,看看贡献者怎么说。理想情况下,它会首先通过它们的 url 存储路由,然后检查是否可以为给定的 url 执行适当的动词。这将使处理像 405 这样标准的东西更容易。

事实上,我在 github 上发现了一个关于上述问题的问题: https ://github.com/sinatra/sinatra/issues/24 正如在底部附近提到的那样,它目前没有被处理,他们可能会在 v2.0 上工作

于 2013-05-07T13:10:25.337 回答