仆人

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,这对于快速启动和运行非常有用。