【问题标题】:Lookup query parameters in Yesod在 Yesod 中查找查询参数
【发布时间】:2014-10-04 20:39:22
【问题描述】:

我刚刚使用 yesod init 初始化了一个 Yesod 项目(无数据库)。

我的HomeR GET 处理程序如下所示:

getHomeR :: Handler Html
getHomeR = do
    (formWidget, formEnctype) <- generateFormPost sampleForm
    let submission = Nothing :: Maybe (FileInfo, Text)
        handlerName = "getHomeR" :: Text
    defaultLayout $ do
        aDomId <- newIdent
        setTitle "Welcome To Yesod!"
        $(widgetFile "homepage")

使用yesod devel时,我可以访问默认主页http://localhost:3000/

如何修改上面列出的处理程序以在访问此 URL 时检索(并显示)像 id=abc123 这样的 HTTP GET 查询参数:

http://localhost:3000/?id=abc123

注意:这个问题是问答式回答的,因此故意不显示研究成果!

【问题讨论】:

    标签: haskell yesod query-parameters


    【解决方案1】:

    我将展示两种不同的方法来实现这一点。对于这两种情况,您都需要将此代码添加到您的模板中,例如在homepage.hamlet:

    请注意,访问 URL 时不保证存在任何 id 参数,因此两种方法产生的类型都是 Maybe Text。模板参数的详细解释见the Shakespearean template docs

    方法一:lookupGetParam

    执行此操作的最简单方法是使用 lookupGetParam,如下所示:

    idValueMaybe <- lookupGetParam "id"
    

    使用yesod init生成的默认设置时,如果在模板中使用idValueMaybe,则idValueMaybe需要在getHomeRpostHomeR中定义。

    您的HomeR GET 处理程序可能如下所示:

    getHomeR :: Handler Html
    getHomeR = do
        idValueMaybe <- lookupGetParam "id"
        (formWidget, formEnctype) <- generateFormPost sampleForm
        let submission = Nothing :: Maybe (FileInfo, Text)
            handlerName = "getHomeR" :: Text
        defaultLayout $ do
            aDomId <- newIdent
            setTitle "Welcome To Yesod!"
            $(widgetFile "homepage")
    

    方法二:reqGetParams

    您还可以使用reqGetParams 检索查询键/值对列表,而不是按名称查找查询参数。这在某些情况下可能是有利的,例如如果您事先不知道所有可能的密钥。使用标准的lookup 函数,您可以轻松地在该列表中查找某个键。

    您的代码的相关部分可能如下所示:

    getParameters <- reqGetParams <$> getRequest
    let idValueMaybe = lookup "id" getParameters :: Maybe Text
    

    您的getHomeR 可能如下所示:

    getHomeR :: Handler Html
    getHomeR = do
        getParameters <- reqGetParams <$> getRequest
        let idValueMaybe = lookup "id" getParameters :: Maybe Text
        (formWidget, formEnctype) <- generateFormPost sampleForm
        let submission = Nothing :: Maybe (FileInfo, Text)
            handlerName = "getHomeR" :: Text
        defaultLayout $ do
            aDomId <- newIdent
            setTitle "Welcome To Yesod!"
            $(widgetFile "homepage")
    

    【讨论】:

    • 如何在POST方法请求中使用第二种方法?
    猜你喜欢
    • 2020-10-07
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多