我正在使用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
也许这有帮助。
答案 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)