我一直在两个不同的项目中为Pivotal Tracker工具实现客户端绑定.一个项目使用wreq库,而另一个项目依赖于servant.
我想合并两个项目,但我不确定使用哪种设计方法.所以有助于我解决这个问题的问题是:
将我的API定义为一种类型(除了可读性)有什么具体的优势吗?
哪个错误处理会为库的用户,servant EitherT ServantError IO ()
或wreq的Exception样式生成更少的代码?
phadej.. 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
要么
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 ...
他们并没有那么不同.使用wreq
(或http-client
直接)你可能会实现一些帮助函数(比如getOne
)来进行提取; 什么时候和servant
你一起"免费".
两者都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
要么
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 ...
他们并没有那么不同.使用wreq
(或http-client
直接)你可能会实现一些帮助函数(比如getOne
)来进行提取; 什么时候和servant
你一起"免费".