Обработка запроса 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?


person Otoma    schedule 12.04.2017    source источник
comment
Я вижу функцию requestMethod в Network.Wai. Сможете ли вы сопоставить этот результат?   -  person ryachza    schedule 12.04.2017


Ответы (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" -> {- … -}
  …
person Jon Purdy    schedule 13.04.2017

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

(params, files) <- parseRequestBody lbsBackEnd request

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

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

person liminalisht    schedule 12.04.2017