【问题标题】:How to force Servant return JSON errors instead of plain strings?如何强制 Servant 返回 JSON 错误而不是纯字符串?
【发布时间】:2020-04-14 16:02:37
【问题描述】:

默认情况下,即使请求的端点返回 JSON,Servant 也会返回纯字符串请求

$ http $S/signup email=mail@domain.com
HTTP/1.1 400 Bad Request
Connection: keep-alive
Date: Tue, 14 Apr 2020 15:59:32 GMT
Server: nginx/1.17.9 (Ubuntu)
Transfer-Encoding: chunked

Error in $: parsing Credentials.Credentials(Credentials) failed, key "password" not found

我正在尝试将这些字符串包装成简单的JSON 字典:

$ http $S/signup email=mail@domain.com
HTTP/1.1 400 Bad Request
Connection: keep-alive
Date: Tue, 14 Apr 2020 15:59:32 GMT
Server: nginx/1.17.9 (Ubuntu)
Transfer-Encoding: chunked

{"error": "Error in $: parsing Credentials.Credentials(Credentials) failed, key \"password\" not found"}

但看起来没那么容易。

这个问题说明了可能的解决方案,但我今天无法让它们工作Custom JSON errors for Servant-server

在此线程 https://github.com/haskell-servant/servant/issues/732 中讨论了另一种方法,但对于这样一个简单的任务来说似乎有点过头了。

不知道2020年有没有简单稳健的解决方案?

【问题讨论】:

    标签: json haskell servant


    【解决方案1】:

    有一个名为servant-errors 的库。它提供了一个完全符合您要求的中间件——将错误响应转换为您选择的统一结构,JSON 是内置选项之一。

    查看文档了解详情,但基本用法和包装一样简单

    errorMw @JSON @["error", "status"]
    

    围绕您的应用程序。

    【讨论】:

    • 谢谢,解析错误可以正常工作,但对于数据库错误,我仍然得到纯文本 Something went wrong 响应。你知道是否可以将所有内部错误转换为JSON
    • 这个中间件只修改错误代码 > 200 且没有 Content-Type 标头的响应,因此如果您的错误具有错误的 HTTP 状态或设置了 Content-Type,可能会导致它们不会被重写。另一种可能的选择是通过应用之前的中间件引发错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多