Haskell 发现端点的 Web 框架?
Haskell Web frameworks that discover endpoints?
是否有 haskell 网络框架或方法可以使 end rest api 端点方法可发现,而不必返回以将新的端点函数附加到主方法?
解释:
我正在评估 haskell 网络框架,我发现所有这些框架的共同点是有一个地方可以定义您的端点。
意思是,每次我创建一个新端点时,我都必须创建函数,然后在主函数中输入端点。
我举几个例子。
type Api = SpockM () () () ()
type ApiAction a = SpockAction () () () a
main :: IO ()
main = do
spockCfg <- defaultSpockCfg () PCNoDatabase ()
runSpock 8080 (spock spockCfg app)
app :: Api
app = do
get "people" $ do
json $ Person { name = "Fry", age = 25 }
对于新端点,我需要修改应用程序功能。
type UserAPI2 = "users" :> Get '[JSON] [User]
:<|> "albert" :> Get '[JSON] User
:<|> "isaac" :> Get '[JSON] User
isaac :: User
isaac = User "Isaac Newton" 372 "isaac@newton.co.uk" (fromGregorian 1683 3 1)
albert :: User
albert = User "Albert Einstein" 136 "ae@mc2.org" (fromGregorian 1905 12 1)
users2 :: [User]
users2 = [isaac, albert]
server2 :: Server UserAPI2
server2 = return users2
:<|> return albert
:<|> return isaac
对于每个新端点,我都需要附加到 server2 函数。
appInit :: SnapletInit App App
appInit = makeSnaplet "myapp" "My example application" Nothing $ do
hs <- nestSnaplet "heist" heist $ heistInit "templates"
fs <- nestSnaplet "foo" foo $ fooInit
bs <- nestSnaplet "" bar $ nameSnaplet "newname" $ barInit foo
addRoutes [ ("hello", writeText "hello world")
, ("fooname", with foo namePage)
, ("barname", with bar namePage)
, ("company", companyHandler)
]
wrapSite (<|> heistServe)
ref <- liftIO $ newIORef "fooCorp"
return $ App hs fs bs ref
对于我要添加的每个新端点,我都需要附加到 addRoutes 函数。
在所有这些示例和我查看的每个其他框架中,如果我想添加一个新端点,我总是必须返回到主文件中的一个函数来添加新路由。
我希望那里会有一些东西,我可以在一个新文件中编写我的新端点函数,它会被 web 框架发现,所以我不必继续添加到现有的功能。
在 .net Web Api 中,它看起来像这样。
一个地方来定义默认路由。
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
新的 class 和文件已添加到项目中。框架会在运行时将此方法发现为端点并添加它。我不必返回主函数来附加此端点。
[Route("api/books")]
[HttpPost]
public HttpResponseMessage CreateBook(Book book) { ... }
只要您使用 the scaffolded site Yesod 框架,您就可以非常接近您对它的期望。流程将如下所示:
1) 在路由文件中添加新路由
/myRoute MyRouteR GET
2)在Handler
目录下已有的Handler模块中为其定义一个handler:
getMyRouteR :: Handler Html
getMyRouteR = return $(shamletFile "templates/myRoute.shamlet")
流程到此结束。
是否有 haskell 网络框架或方法可以使 end rest api 端点方法可发现,而不必返回以将新的端点函数附加到主方法?
解释:
我正在评估 haskell 网络框架,我发现所有这些框架的共同点是有一个地方可以定义您的端点。
意思是,每次我创建一个新端点时,我都必须创建函数,然后在主函数中输入端点。
我举几个例子。
type Api = SpockM () () () ()
type ApiAction a = SpockAction () () () a
main :: IO ()
main = do
spockCfg <- defaultSpockCfg () PCNoDatabase ()
runSpock 8080 (spock spockCfg app)
app :: Api
app = do
get "people" $ do
json $ Person { name = "Fry", age = 25 }
对于新端点,我需要修改应用程序功能。
type UserAPI2 = "users" :> Get '[JSON] [User]
:<|> "albert" :> Get '[JSON] User
:<|> "isaac" :> Get '[JSON] User
isaac :: User
isaac = User "Isaac Newton" 372 "isaac@newton.co.uk" (fromGregorian 1683 3 1)
albert :: User
albert = User "Albert Einstein" 136 "ae@mc2.org" (fromGregorian 1905 12 1)
users2 :: [User]
users2 = [isaac, albert]
server2 :: Server UserAPI2
server2 = return users2
:<|> return albert
:<|> return isaac
对于每个新端点,我都需要附加到 server2 函数。
appInit :: SnapletInit App App
appInit = makeSnaplet "myapp" "My example application" Nothing $ do
hs <- nestSnaplet "heist" heist $ heistInit "templates"
fs <- nestSnaplet "foo" foo $ fooInit
bs <- nestSnaplet "" bar $ nameSnaplet "newname" $ barInit foo
addRoutes [ ("hello", writeText "hello world")
, ("fooname", with foo namePage)
, ("barname", with bar namePage)
, ("company", companyHandler)
]
wrapSite (<|> heistServe)
ref <- liftIO $ newIORef "fooCorp"
return $ App hs fs bs ref
对于我要添加的每个新端点,我都需要附加到 addRoutes 函数。
在所有这些示例和我查看的每个其他框架中,如果我想添加一个新端点,我总是必须返回到主文件中的一个函数来添加新路由。
我希望那里会有一些东西,我可以在一个新文件中编写我的新端点函数,它会被 web 框架发现,所以我不必继续添加到现有的功能。
在 .net Web Api 中,它看起来像这样。
一个地方来定义默认路由。
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
新的 class 和文件已添加到项目中。框架会在运行时将此方法发现为端点并添加它。我不必返回主函数来附加此端点。
[Route("api/books")]
[HttpPost]
public HttpResponseMessage CreateBook(Book book) { ... }
只要您使用 the scaffolded site Yesod 框架,您就可以非常接近您对它的期望。流程将如下所示:
1) 在路由文件中添加新路由
/myRoute MyRouteR GET
2)在Handler
目录下已有的Handler模块中为其定义一个handler:
getMyRouteR :: Handler Html
getMyRouteR = return $(shamletFile "templates/myRoute.shamlet")
流程到此结束。