4

我正在使用 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

也许这有帮助。

4

2 回答 2

0

我可能不明白究竟是什么输出,但如果你想覆盖 404 你将不得不做类似下面的事情,而不是error 404 do

not_found do
    # Set content
    {"bang" => "bong"}
end
于 2013-03-28T06:29:06.583 回答
0

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

  • 当在前过滤器或路由中使用停止时,状态、标题和正文将在后过滤器中正确设置。(康斯坦丁·哈斯)

  • 在错误处理程序中将状态代码设置为 404 不再触发 not_found 处理程序。(康斯坦丁·哈斯)

于 2013-07-03T06:29:07.627 回答