Как заставить Servant возвращать JSON ошибок вместо простых строк? - PullRequest
4 голосов
/ 14 апреля 2020

По умолчанию Servant возвращает запросы в виде простой строки, даже если запрошенная конечная точка возвращает 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 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"}

Но, похоже, это не так просто.

В этом вопросе указаны возможные решения, но я не могу заставить их работать сегодня Пользовательские JSON Ошибки для Servant-сервера

В этой теме обсуждается другой подход https://github.com/haskell-servant/servant/issues/732, но он выглядит излишним для такой простой задачи.

Интересно, будет ли в 2020 году простое и надежное решение?

1 Ответ

4 голосов
/ 15 апреля 2020

Существует библиотека с именем servant-errors. Он предоставляет промежуточное программное обеспечение, которое делает именно то, что вы ищете - преобразует ответы об ошибках в единую структуру по вашему выбору, JSON является одной из встроенных опций.

Подробности см. В документации, но базовое использование c так же просто, как и обертывание

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

вокруг вашего приложения.

...