Обработка POST-запроса в Wai/Warp в Haskell

У меня есть приложение wai/warp. Как я могу обработать почтовый запрос? У меня есть это:

app :: Application
app request respond = 
    respond $ case rawPathInfo request of
        "/"  -> responseFile status200 ............
        "/some_post_req/" -> .....

Как я могу указать, что some_post_req должен быть POST?

2 ответа

Это должно быть так же просто, как сравнение результата Network.Wai.requestMethod против Network.Wai.methodPost:

app request respond
  | requestMethod request == methodPost
  = respond $ case rawPathInfo request of
    {- handle POST routes -}

  | otherwise
  = {- handle other request methods -}

Поскольку есть константы для methodPost, methodGetи т. д., вы можете использовать их, но Method это псевдоним для ByteStringтак что вы также можете использовать OverloadedStrings расширение:

{-# LANGUAGE OverloadedStrings #-}

А затем либо сравните со строковым литералом:

requestMethod request == "POST"

Или образец соответствия:

case requestMethod request of
  "POST" -> {- … -}
  "GET" -> {- … -}
  …

parseRequestBody в wai-extra Пакет позволяет получить нужные данные из тела запроса:

(params, files) <- parseRequestBody lbsBackEnd request

Но это ничего не значит, чтобы указать, что запрос должен быть POST запрос. Имейте в виду, что wai может быть довольно низкого уровня, и есть пакеты более высокого уровня.

servant приходит в голову как пакет, который позволяет вам определять API на уровне типа. С помощью servant вы определенно можете указать ожидаемый HTTP-глагол. Смотрите здесь.

Другие вопросы по тегам