使用 Yesod 莎士比亚的仆人(哈姆雷特、朱利叶斯、卢修斯)
Using Servant with Yesod shakespeare (Hamlet, Julius, Lucius)
我如何将 shakespeare(来自 yesod)用于服务网络服务 API?
我试试:
type TestAPI
= "tests" :> Get '[JSON] [Test]
:<|> "Test.html" :> Get '[HTML] Html
serverTestAPI :: ServerT TestAPI AppM
serverTestAPI = tests
:<|> test
:<|> testHtml
tests :: AppM [Test]
tests = do return [ Test 1 "Test 1"
, Test 2 "Test 2"
]
testHtml = [hamlet|
$doctype 5
.........
|]
但是我得到错误!
正如@Carsten 指出的那样,在这种情况下,您想要的是 shamlet
。关键是实现 ToMarkup
类型类的正确实例。我建议您在莎士比亚模板上阅读此 excellent introduction。一个工作示例:
data Person = Person
{ firstName :: String
, lastName :: String
} deriving Generic
instance ToJSON Person
type PersonAPI = "persons" :> Get '[JSON, HTML] [Person]
people :: [Person]
people =
[ Person "Isaac" "Newton"
, Person "Albert" "Einstein"
]
instance ToMarkup Person where
toMarkup person = showPerson person
-- this isn't properly implemented
preEscapedToMarkup p = showPerson p
-- HTML serialization of a list of persons
instance ToMarkup [Person] where
toMarkup persons = showPersons persons
preEscapedToMarkup p = showPersons p
showPerson :: Person -> Html
showPerson p = [shamlet|
<body>
<p>This is my page.
<h1>#{firstName p}
|]
showPersons :: [Person] -> Html
showPersons p = [shamlet|
<body>
<p>This is my page.
$forall person <- p
<h1>#{firstName person}
|]
这是一个适合我的完整小例子:
{-# LANGUAGE DataKinds, PolyKinds, TypeOperators, DeriveGeneric #-}
{-# LANGUAGE QuasiQuotes #-}
module Main where
import Data.Aeson
import Data.Proxy
import GHC.Generics
import Network.Wai.Handler.Warp
import Servant.API
import Servant.HTML.Blaze
import Servant.Server
import Text.Blaze.Html
import Text.Hamlet
data Test = Test Int String
deriving (Generic)
instance ToJSON Test
type TestAPI
= "tests" :> Get '[JSON] [Test]
:<|> "Test.html" :> Get '[HTML] Html
main :: IO ()
main = run 8080 (serve (Proxy :: Proxy TestAPI) serverTestAPI)
serverTestAPI :: Server TestAPI
serverTestAPI = tests :<|> testHtml
tests = return [ Test 1 "Test 1"
, Test 2 "Test 2"
]
testHtml = return [shamlet|
$doctype 5
<html>
<head>
<title>This is a title
<body>
<p>This is text
|]
谢谢大家的帮助!
实现如下:
<code>type TestAPI
= "tests" :> Get '[JSON] [Test]
:<|> "test" :> Get '[JSON] Test
:<|> "TestHTML.html" :> Get '[HTML] Page_TestHTML
serverTestAPI :: ServerT TestAPI AppM
serverTestAPI = tests
:<|> test
:<|> testHtml
data Page_TestHTML = Page_TestHTML
instance ToMarkup Page_TestHTML where
toMarkup Page_TestHTML = builderHtml
testHtml = return Page_TestHTML
builderHtml = [shamlet|
$doctype 5
<html>
<head>
<title>Greeting2
<body>
<h2> Hello world HTML Qqqqq |]</code>
我如何将 shakespeare(来自 yesod)用于服务网络服务 API?
我试试:
type TestAPI
= "tests" :> Get '[JSON] [Test]
:<|> "Test.html" :> Get '[HTML] Html
serverTestAPI :: ServerT TestAPI AppM
serverTestAPI = tests
:<|> test
:<|> testHtml
tests :: AppM [Test]
tests = do return [ Test 1 "Test 1"
, Test 2 "Test 2"
]
testHtml = [hamlet|
$doctype 5
.........
|]
但是我得到错误!
正如@Carsten 指出的那样,在这种情况下,您想要的是 shamlet
。关键是实现 ToMarkup
类型类的正确实例。我建议您在莎士比亚模板上阅读此 excellent introduction。一个工作示例:
data Person = Person
{ firstName :: String
, lastName :: String
} deriving Generic
instance ToJSON Person
type PersonAPI = "persons" :> Get '[JSON, HTML] [Person]
people :: [Person]
people =
[ Person "Isaac" "Newton"
, Person "Albert" "Einstein"
]
instance ToMarkup Person where
toMarkup person = showPerson person
-- this isn't properly implemented
preEscapedToMarkup p = showPerson p
-- HTML serialization of a list of persons
instance ToMarkup [Person] where
toMarkup persons = showPersons persons
preEscapedToMarkup p = showPersons p
showPerson :: Person -> Html
showPerson p = [shamlet|
<body>
<p>This is my page.
<h1>#{firstName p}
|]
showPersons :: [Person] -> Html
showPersons p = [shamlet|
<body>
<p>This is my page.
$forall person <- p
<h1>#{firstName person}
|]
这是一个适合我的完整小例子:
{-# LANGUAGE DataKinds, PolyKinds, TypeOperators, DeriveGeneric #-}
{-# LANGUAGE QuasiQuotes #-}
module Main where
import Data.Aeson
import Data.Proxy
import GHC.Generics
import Network.Wai.Handler.Warp
import Servant.API
import Servant.HTML.Blaze
import Servant.Server
import Text.Blaze.Html
import Text.Hamlet
data Test = Test Int String
deriving (Generic)
instance ToJSON Test
type TestAPI
= "tests" :> Get '[JSON] [Test]
:<|> "Test.html" :> Get '[HTML] Html
main :: IO ()
main = run 8080 (serve (Proxy :: Proxy TestAPI) serverTestAPI)
serverTestAPI :: Server TestAPI
serverTestAPI = tests :<|> testHtml
tests = return [ Test 1 "Test 1"
, Test 2 "Test 2"
]
testHtml = return [shamlet|
$doctype 5
<html>
<head>
<title>This is a title
<body>
<p>This is text
|]
谢谢大家的帮助!
实现如下:
<code>type TestAPI
= "tests" :> Get '[JSON] [Test]
:<|> "test" :> Get '[JSON] Test
:<|> "TestHTML.html" :> Get '[HTML] Page_TestHTML
serverTestAPI :: ServerT TestAPI AppM
serverTestAPI = tests
:<|> test
:<|> testHtml
data Page_TestHTML = Page_TestHTML
instance ToMarkup Page_TestHTML where
toMarkup Page_TestHTML = builderHtml
testHtml = return Page_TestHTML
builderHtml = [shamlet|
$doctype 5
<html>
<head>
<title>Greeting2
<body>
<h2> Hello world HTML Qqqqq |]</code>