http API客户端的Wreq或Servant?

Dio*_*zus 3 haskell

我一直在两个不同的项目中为Pivotal Tracker工具实现客户端绑定.一个项目使用wreq库,而另一个项目依赖于servant.

我想合并两个项目,但我不确定使用哪种设计方法.所以有助于我解决这个问题的问题是:

  1. 将我的API定义为一种类型(除了可读性)有什么具体的优势吗?

  2. 哪个错误处理会为库的用户,servant EitherT ServantError IO ()或wreq的Exception样式生成更少的代码?

pha*_*dej 5

两者都http-client在引擎盖下使用.

在Haskell中,编写Web api绑定最常用的部分是数据定义和JSON序列化规范.该wreq实现使用的镜头,wreq是lensy HTTP库.

之后,您想提供一些函数(使用IO)从右端点获取数据:

getStory :: Options -> Int -> Int -> IO Story
getStory options projectId storyId =
    getOne options $ "/projects/" ++ show projectId ++ "/stories/" ++ show storyId
Run Code Online (Sandbox Code Playgroud)

要么

type API = "services" :> "v5" :> "stories"
             :> Header "X-TrackerToken" Text
             :> Capture ":storyId" StoryId
             :> Get '[JSON] Story

story :: Text -> StoryId -> EitherT ServantErr IO Story
story :<|> ... =  client api ...
Run Code Online (Sandbox Code Playgroud)

他们并没有那么不同.使用wreq(或http-client直接)你可能会实现一些帮助函数(比如getOne)来进行提取; 什么时候和servant你一起"免费".