是否有一個haskell web框架或方法使end api端點方法可被發現,而不必回過頭去追加新的端點函數到一個主要方法?發現端點的Haskell Web框架?
說明:
我評價一個哈斯克爾web框架和東西,我在所有的人都看到常見的是,有一個地方來定義端點。
這意味着,每當我創建一個新的端點時,我都必須創建該功能,然後在主功能中輸入端點。
我會舉幾個例子。
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 "[email protected]" (fromGregorian 1683 3 1)
albert :: User
albert = User "Albert Einstein" 136 "[email protected]" (fromGregorian 1905 12 1)
users2 :: [User]
users2 = [isaac, albert]
server2 :: Server UserAPI2
server2 = return users2
:<|> return albert
:<|> return isaac
對於每一個新的終結點,我將需要追加到服務器2的功能。
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 }
);
添加到項目中的新類和文件。該框架將在運行時發現該方法爲端點並添加它。我不必回到主函數來追加這個端點。
[Route("api/books")]
[HttpPost]
public HttpResponseMessage CreateBook(Book book) { ... }