2017-08-06 5 views
1

mainメソッドに新しいエンドポイント関数を追加する必要はなく、end rest apiエンドポイントメソッドを検出可能にするためのhaskell Webフレームワークまたはメソッドがありますか?エンドポイントを発見するHaskell Webフレームワーク?

説明:

私は評価してるHaskellのWebフレームワークと私はそれらのすべてに共通見る何かがあなたのエンドポイントを定義するための一つの場所があるということです。

意味、私は新しいエンドポイントを作成するたびに、関数を作成してmain関数にエンドポイントを入力する必要があります。

いくつか例を挙げます。新しいエンドポイントの

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 

、私は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では、これは次のようになります。

デフォルトのルーティングを定義する1か所。

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") 

それが流れの終わりです。

関連する問題