【问题标题】:How to pass HTTP request parameter to quickQuery?如何将 HTTP 请求参数传递给 quickQuery?
【发布时间】:2018-02-17 20:12:47
【问题描述】:

我正在使用 Happstack 从 HTTP 请求中接收一些参数,然后将这些参数传递给一个函数,该函数将从数据库中检索数据并在 HTTP 响应中返回这些数据,如下所示:

myFunc :: IO String
myFunc = do r <- look "personId"
            conn <- connectODBC "... my connection string ...";
            vals <- quickQuery conn ("SELECT Name FROM Person where Id = ?") [(toSql r)];
            return (processData vals)

handlers :: ServerPartT IO Response
handlers = do
       x <- liftIO (myFunc);
       decodeBody (defaultBodyPolicy "/tmp/" 0 1000 1000)
       msum [ 
              dir "getData" $ ok $ toResponse x
            , ... other handlers ...
            ]

mainFunc = simpleHTTP nullConf handlers

但是当我构建上面的代码时,我得到了以下错误:

没有因使用“look”而产生的 (HasRqData IO) 实例 在 'do' 块的 stmt 中: r

在阅读了关于类似问题的问题(如this one)后,我认为我必须在某处包含HasRqData 约束,但我无法了解在哪里以及如何使用。

【问题讨论】:

    标签: haskell happstack hdbc


    【解决方案1】:

    您可能已经猜到了,这对于 monad 来说也是一个问题。在happstackHasRqData 等)中有一个handful,因此您可能会认为这是一个复杂的案例。

    让我们从 innocent-looking look 函数开始。

    look :: (Functor m, Monad m, HasRqData m) => String -> m String
    

    确实,有一个重要的约束HasRqData。让我们扪心自问:what monads HaveRqData? (碰巧IO 没有!)

    class HasRqData m where
    ...
    
    Instances
        HasRqData RqData         
        (MonadIO m, MonadPlus m) => HasRqData (ServerPartT m)
        ...
    

    其他实例是前两个的派生,所以,看起来我们必须先考虑这两个选项。

    • RqData 的作用有限——您只能使用look 及其派生词,从手头的请求中提取信息。由于我们还希望产生其他效果——例如查询数据库——这对我们来说是不够的。
    • ServerPartT mold friend of oursServerPart ≡ ServerPartT IO 的一般形式。碰巧它也是HasRqData。这不是巧合,而是happstack 设计的暗示——看起来作者的意思是我们要在任何地方使用这个单子,除非我们需要特定的粒度。所以,让我们试一试吧。

     

    myFunc :: ServerPart String
    myFunc = do r <- look "personId"
                return undefined
    

    这会编译。

    现在,我们甚至不需要在 handlers 中提升 myFunc — 我们的 previous predicament 自行解决了。不过,我们需要通过之前讨论过的jar logic 来提升对数据库的访问权限。

    我相信你可以自己弄清楚细节。无论如何,让我知道结果如何!

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 2012-08-28
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2016-04-01
      • 2012-01-13
      相关资源
      最近更新 更多