我正在使用 Sinatra 开发这个 JSON API。按照我的设计方式,错误消息也以特定格式以 JSON 格式传递。唯一的区别是它们的响应将具有 4xx 状态代码而不是 2xx 或 3xx。现在,我遇到的问题:
我定义了一个通用过滤器,我在其中设置了响应内容类型。像这样:
before { content_type :json }
问题是,每次我调用停止时,都没有考虑到这个设置。我必须以一种非常丑陋、更冗长且容易出错的方式自己在停止调用中设置它:
halt [404, {"Content-Type" => "application/json;charset=utf-8"}]
还有另一种方法吗?
最让我困扰的问题是:当我在捕获 404 错误(见下文)、JSON 内容类型和 json 正文后停止代码 404 时,奇怪的是,我没有得到任何正文,浏览器和 curl 都没有得到它。怎么来的?
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
也许这有帮助。