【问题标题】:Handling POST request in Wai/Warp in Haskell在 Haskell 的 Wai/Warp 中处理 POST 请求
【发布时间】:2019-01-08 21:48:38
【问题描述】:

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

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

如何指定some_post_req 必须是POST?

【问题讨论】:

  • 我在 Network.Wai 中看到了一个 requestMethod 函数 - 你能匹配那个结果吗?

标签: haskell haskell-wai haskell-warp


【解决方案1】:

应该就像比较Network.Wai.requestMethodNetwork.Wai.methodPost 的结果一样简单:

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

  | otherwise
  = {- handle other request methods -}

由于methodPostmethodGet等有常量,你不妨使用它们,但MethodByteString的别名,所以你也可以使用OverloadedStrings扩展:

{-# LANGUAGE OverloadedStrings #-}

然后与字符串文字比较:

requestMethod request == "POST"

或模式匹配:

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

【讨论】:

    【解决方案2】:

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

    (params, files) <- parseRequestBody lbsBackEnd request
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      相关资源
      最近更新 更多