Sinatra:关于过滤器,停止和身体404错误

时间:2013-03-27 13:01:25

标签: json http sinatra

我正在使用Sinatra开发此JSON API。我设计它的方式,错误消息也以特定格式以JSON格式提供。唯一的区别是他们的响应将具有4xx状态代码而不是2xx或3xx。现在,我遇到的问题:

  • 我定义了一个通用过滤器,我在其中设置了响应内容类型。像这样:

    before { content_type :json }
    
    问题是,每次我打电话停止时,都不考虑此设置。我必须以一种非常丑陋,冗长且容易出错的方式将其设置为停止呼叫:

    halt [404, {"Content-Type" => "application/json;charset=utf-8"}]
    

    还有其他办法吗?

  • 最让我感兴趣的问题是:当我在捕获404错误(见下文),JSON内容类型和json正文后停止使用代码404时,奇怪的是,我没有得到任何正文,也没有浏览器也不卷曲得到它。怎么会?

    error 404 do
      halt [404...{"bang" => "bong"....}]
    end
    

更新

关于最后一个问题,以下是使用curl并触发将在404错误块中调用的调用:

curl http://faulty_url

# curl log:
curl: (52) Empty reply from server

# sinatra log:
!! Unexpected error while processing request: Content-Length header was 221, but should be 227
127.0.0.1 - - [28/Mar/2013 11:28:47] "GET / HTTP/1.1" 404 221 0.0664

也许这有帮助。

2 个答案:

答案 0 :(得分:0)

我可能无法准确理解输出是什么,但如果您要覆盖404,则必须执行以下操作,而不是error 404 do

not_found do
    # Set content
    {"bang" => "bong"}
end

答案 1 :(得分:0)

您使用的是哪个版本的Sinatra?查看Sinatra的最新更改日志,我看到1.4.x版本中的两个条目似乎可能是相关的:

  • 在过滤器或路径中使用暂停时,状态,标题和正文将在后过滤器中正确设置。 (Konstantin Haase)

  • 在错误处理程序中将状态代码设置为404不再触发not_found处理程序。 (Konstantin Haase)