僕人
Servant 是一個用於在型別級別宣告 API 的庫,然後:
- 寫伺服器(這部分服務員可以被認為是一個 Web 框架),
- 獲取客戶端函式(在 haskell 中),
- 為其他程式語言生成客戶端函式,
- 生成 Web 應用程式的文件
- 和更多…
Servant 擁有簡潔而強大的 API。一個簡單的 API 可以用很少的程式碼行編寫:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import Data.Text
import Data.Aeson.Types
import GHC.Generics
import Servant.API
data SortBy = Age | Name
data User = User {
name::String,
age::Int
} deriving (Eq, Show, Generic)
instance ToJSON User -- automatically convert User to JSON
現在我們可以宣告我們的 API:
type UserAPI = "users" :> QueryParam "sortby" SortBy :> Get '[JSON] [User]
其中宣告我們希望使用型別為 SortBy
的查詢引數 sortby
將/users
暴露給 GET
請求,並在響應中返回 User
型別的 JSON。
現在我們可以定義處理程式:
-- This is where we'd return our user data, or e.g. do a database lookup
server::Server UserAPI
server = return [User "Alex" 31]
userAPI::Proxy UserAPI
userAPI = Proxy
app1 :: Application
app1 = serve userAPI server
偵聽埠 8081
併為我們的使用者 API 提供服務的主要方法:
main::IO ()
main = run 8081 app1
注意, Stack 有一個模板用於在 Servant 中生成基本 API,這對於快速啟動和執行非常有用。