Uli*_*ler 8 haskell query-parameters yesod
我刚刚初始化了一个Yesod项目(没有数据库)yesod init.
我的HomeRGET处理程序如下所示:
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")
Run Code Online (Sandbox Code Playgroud)
使用时yesod devel,我可以访问默认主页http://localhost:3000/.
如何修改上面列出的处理程序以检索(和显示)HTTP GET查询参数,例如id=abc123访问此URL时:
http://localhost:3000/?id=abc123
注意:这个问题已经回答Q&A风格,因此故意不显示研究工作!
Uli*_*ler 15
我将展示两种不同的方法来实现这一目标.对于这两者,您需要将此代码添加到模板中,例如homepage.hamlet:
请注意,不保证id在访问URL时存在任何参数,因此两种方法产生的类型都是Maybe Text.有关模板参数的详细说明,请参阅莎士比亚模板文档.
方法1:lookupGetParam
最简单的方法就是这样使用lookupGetParam:
idValueMaybe <- lookupGetParam "id"
Run Code Online (Sandbox Code Playgroud)
当使用默认设置生成时yesod init,idValueMaybe需要在两者中定义,getHomeR并在模板中使用postHomeRif idValueMaybe.
您的HomeRGET处理程序可能如下所示:
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")
Run Code Online (Sandbox Code Playgroud)
方法2:reqGetParams
您也可以使用以下方法检索查询键/值对列表,而不是按名称查找查询参数reqGetParams.这在某些情况下可能是有利的,例如,如果您事先不知道所有可能的键.使用标准lookup功能,您可以轻松查找该列表中的某个键.
代码的相关部分可能如下所示:
getParameters <- reqGetParams <$> getRequest
let idValueMaybe = lookup "id" getParameters :: Maybe Text
Run Code Online (Sandbox Code Playgroud)
你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")
Run Code Online (Sandbox Code Playgroud)