僕人

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,這對於快速啟動和執行非常有用。