【问题标题】:Haskell Web frameworks that discover endpoints?发现端点的 Haskell Web 框架?
【发布时间】:2017-08-06 18:01:10
【问题描述】:

是否有一个 haskell web 框架或方法可以让 end rest api 端点方法可被发现,而不是必须返回将新的端点函数附加到 main 方法?

解释:

我正在评估 Haskell Web 框架,我认为所有这些框架的共同点是有一个地方可以定义您的端点。

意思是,每次创建一个新的endpoint,我都要make函数,然后在main函数中输入endpoint。

我会举一些例子。

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 "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 函数。

Snap

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

【问题讨论】:

    标签: haskell routing web-frameworks


    【解决方案1】:

    如果您使用的是它提供的the scaffolded site,您可以通过 Yesod 框架获得非常接近您的期望。流程将如下所示:

    1) 在路由文件中添加新路由

    /myRoute MyRouteR GET
    

    2)在Handler目录下已有的Handler模​​块中为其定义一个handler:

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

    这就是流程的结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 2014-03-17
      相关资源
      最近更新 更多