我刚刚使用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风格,因此故意不展示研究工作!
答案 0 :(得分:13)
我将展示两种不同的方法来实现这一目标。对于这两种情况,您需要将此代码添加到模板中,例如在homepage.hamlet
:
请注意,无法保证访问URL时存在任何id
参数,因此两种方法产生的类型均为Maybe Text
。有关模板参数的详细说明,请参阅the Shakespearean template docs。
方法1:lookupGetParam
最简单的方法是使用lookupGetParam
,如下所示:
idValueMaybe <- lookupGetParam "id"
使用yesod init
生成的默认设置时,如果模板中使用了idValueMaybe
,则需要在getHomeR
和postHomeR
中定义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")