Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用查询参数呈现url_Url_Haskell_Yesod_Query Parameters - Fatal编程技术网

使用查询参数呈现url

使用查询参数呈现url,url,haskell,yesod,query-parameters,Url,Haskell,Yesod,Query Parameters,如果找不到解决一个简单问题的方法,答案应该是显而易见的。如何在hamlet模板中使用查询参数呈现url 即,@{ItemsR}将生成http://localhost:3000/items如何生成类似http://localhost:3000/items?page=10&sort=name?是的,如果您希望使用QueryString格式,那么如果您使用RESTful,您应该使用url格式的参数(例如/items/page/10/sortby/name),您将丢失YesSOD类型安全url管理 下面

如果找不到解决一个简单问题的方法,答案应该是显而易见的。如何在hamlet模板中使用查询参数呈现url


即,
@{ItemsR}
将生成
http://localhost:3000/items
如何生成类似
http://localhost:3000/items?page=10&sort=name

是的,如果您希望使用
QueryString
格式,那么如果您使用RESTful,您应该使用url格式的参数(例如
/items/page/10/sortby/name
),您将丢失YesSOD类型安全url管理

下面的示例演示如何使用不同的RESTful表示和重定向(呈现查询字符串url)到从查询字符串读取参数的请求

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE MultiParamTypeClasses #-}
import Yesod
import Data.Text
import Network.Wai.Handler.Warp (run)

data RouteTest = RouteTest

mkYesod "RouteTest" [parseRoutes|
/item/all/page/#Int/sortby/#Text Items1R GET
/items/page/#Int/sortby/#Text Items2R GET
/items/#Int/#Text Items3R GET
/itemsquery ItemsQueryR GET
|]

instance Yesod RouteTest where
    defaultLayout widget = do
        pc <- widgetToPageContent widget
        hamletToRepHtml [hamlet|\<!DOCTYPE html><html lang="en"><body>^{pageBody pc}</body></html>|]

getItemsR :: Text -> Int -> Text -> HandlerT RouteTest IO Html
getItemsR path page sortby =
  defaultLayout [whamlet|
    <h1>Items Page ##{page} sorted by #{sortby}
    <h4>(Using #{path} path format)
    <p>Same request in query string format
      <a href="@{ItemsQueryR}?page=#{page}&sort=#{sortby}">
        here
  |]

getItems1R = getItemsR $ pack "large"
getItems2R = getItemsR $ pack "medium"
getItems3R = getItemsR $ pack "short"

getItemsQueryR = do
  req <- getRequest
  defaultLayout [whamlet|
    <h1>Query String arguments format
    <ul>
      $forall (k, v) <- reqGetParams req
        <li>
          <b>#{k}</b>: #{v}
  |]

main = run 8181 =<< toWaiApp RouteTest
但你必须使用

...
url <- renderItemsQueryR page sortby
defaultLayout [whamlet|
    ...
    <a href=#{url}>
    ...
|]
然后,
renderItemsQueryR
可以写成

renderItemsQueryR page sortby = renderQueryString ItemsQueryR [("page"  , show page)
                                                              ,("sortby", sortby   )]

ItemsR
应该有一些参数,如果我理解正确,请尝试
{ItemsR 10“name”}
,处理程序参数来自路径段。是的,如果您希望使用“传统参数”,您可以直接在模板上呈现url(例如
,因此无法执行类似
{ItemsR[(“page”,“10”),(“sort”,“name”)}
renderQueryString path keyValues = do
  let querystring = intercalate "&" $ map (\(k, v) -> concat [k, "=", v]) keyValues
  hamletToRepHtml [hamlet|@{path}?#{querystring}|]
renderItemsQueryR page sortby = renderQueryString ItemsQueryR [("page"  , show page)
                                                              ,("sortby", sortby   )]