1

我有一个 wai/warp 应用程序。如何处理发布请求?我有这个:

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

如何指定some_post_req必须是 POST?

4

2 回答 2

1

它应该像比较Network.Wai.requestMethodagainst的结果一样简单Network.Wai.methodPost

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

  | otherwise
  = {- handle other request methods -}

methodPost由于, , &c.有常量methodGet,您不妨使用它们,但Method它是 的别名ByteString,因此您也可以使用OverloadedStrings扩展名:

{-# LANGUAGE OverloadedStrings #-}

然后与字符串文字进行比较:

requestMethod request == "POST"

或模式匹配:

case requestMethod request of
  "POST" -> {- … -}
  "GET" -> {- … -}
  …
于 2017-04-13T01:14:11.147 回答
0

parseRequestBodywai-extra包中允许您从请求正文中获取所需的数据:

(params, files) <- parseRequestBody lbsBackEnd request

但这并没有说明请求必须是POST请求。请记住,这wai可能是非常低级别的,并且有更高级别的包。

servant想到一个包,它允许您在类型级别定义 API。使用servant,您绝对可以指定您期望的HTTP 动词。见这里

于 2017-04-12T22:30:46.857 回答