2017-08-06 45 views
1

是否有一個haskell web框架或方法使end api端點方法可被發現,而不必回過頭去追加新的端點函數到一個主要方法?發現端點的Haskell Web框架?

說明:

我評價一個哈斯克爾web框架和東西,我在所有的人都看到常見的是,有一個地方來定義端點。

這意味着,每當我創建一個新的端點時,我都必須創建該功能,然後在主功能中輸入端點。

我會舉幾個例子。

Spock

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 } 

對於新的端點,我需要修改應用程序的功能。

Servant

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) { ... } 

回答

4

你可以得到相當接近你期待什麼用耶索德框架提供你正在使用the scaffolded site提供。流程看起來就像這樣:

1)增加新路線的路線文件

/myRoute MyRouteR GET 

2)定義現有的處理器模塊中爲它處理的Handler目錄下:

getMyRouteR :: Handler Html 
getMyRouteR = return $(shamletFile "templates/myRoute.shamlet") 

而這就是流程的結束。