在Yesod中查找查询参数

时间:2014-08-11 21:57:15

标签: haskell yesod query-parameters

我刚刚使用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时修改上面列出的处理程序以检索(并显示)HTTP GET查询参数,例如id=abc123

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

注意:此问题已回答Q&amp; A风格,因此故意不展示研究工作!

1 个答案:

答案 0 :(得分:13)

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

请注意,无法保证访问URL时存在任何id参数,因此两种方法产生的类型均为Maybe Text。有关模板参数的详细说明,请参阅the Shakespearean template docs

方法1:lookupGetParam

最简单的方法是使用lookupGetParam,如下所示:

idValueMaybe <- lookupGetParam "id"

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

您的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")

方法2: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")