Правильно обрабатывать неверный параметр запроса в Servant - PullRequest
4 голосов
/ 22 апреля 2020

Я следую наряду с учебником Servant , и я определил следующий тип API:

type UsersAPI = "users" :> QueryParam "sortby" SortBy :> Get '[JSON] [UserData]

data SortBy = Id | Name | Age

instance FromHttpApiData SortBy where
  parseQueryParam input =
    case toLower input of
      "name" -> Right Name
      "age"  -> Right Age
      _      -> Left $ append "Invalid sort order: " input

listUsers :: Maybe SortBy -> Handler [UserData]
listUsers = return . Db.getUsers . fromMaybe Id -- Db.getUsers just returns a a sorted in-memory list...

-- rest of implementation ommitted for brevity

Что-то, очевидно, правильно, потому что, если я curl localhost:8081/users?sortby=name или curl localhost:8081/users?sortby=age Я получаю правильно отсортированный список обратно. Однако что-то также сломано, потому что curl localhost:8081/users?sortby=foo не дает мне ожидаемого Invalid sort order: foo. Вместо этого я получаю

parse error: Invalid numeric literal at line 1, column 6

Что я делаю не так?

1 Ответ

0 голосов
/ 23 апреля 2020

Я не могу повторить проблему после клонирования вашего хранилища. При проверке код выглядит хорошо, за исключением хитрых вызовов fromJust.

Ваш репозиторий также даже не создается, по умолчанию - файл stack.yaml должен быть изменен для включения allow-newer: true поле. Если вы используете cabal, то невозможно узнать, какие версии зависимостей вы используете, что затруднит поиск и устранение неисправностей.

Как только это будет сделано, я получу именно то сообщение, которое вы ' я ожидаю:

the expected error output

и все сортировки работают отлично.

Можете ли вы опубликовать более подробную информацию о вашей системе? Как вы строите проект? Какие зависимости используются?

...