【问题标题】:Haskell Servant - is there a way to compose API types?Haskell Servant - 有没有办法组合 API 类型?
【发布时间】:2016-06-07 12:29:14
【问题描述】:

我知道这不是有效的语法,但是有没有办法在仆人中完成类似的事情?

type StandardAPI = "foo" :> Get '[JSON] Whatever

type CustomAPI = StandardAPI :<|> "customroute" :> Get '[JSON] Blah

换句话说,编写 API。在 Spock 中,我可以通过 monadic 路线构造来做到这一点,但我不确定如何在仆人中做到这一点。

这样我可以跨 API 重用共享路由。使用它的另一个原因是某些类型不适用于客户端生成器,例如 Raw。

【问题讨论】:

  • 这看起来像是有效的语法。你到底想做什么:&gt; 不做?这确实构成了 api。

标签: web-services rest haskell servant


【解决方案1】:

是的,引用Servant documentation你可以使用

type CombinedAPI = "users" :> UsersAPI
          :<|> "products" :> ProductsAPI

server :: Server CombinedAPI
server = usersServer :<|> productsServer

usersServer :: Server UsersAPI
usersServer = -- implementation

productsServer :: Server ProductsAPI
productsServer = -- implementation

【讨论】:

  • 有没有办法在没有顶级“用户”的情况下做到这一点?问题是servant-JS 生成的代码不再有效,因为它与CombinedAPI 不对应。我无法在我的 CombinedAPI 等价物上运行 writeJSForAPI,因为它包含一个没有 GenerateList 实例的 Raw 组合器。
  • 抱歉,现在无法回答这个问题。测试它的最佳方法是尝试它。我不认为UsersAPI :&lt;|&gt; "products" :&gt; ProductsAPI 是无效的事情
  • 你说得对,它是有效的。按照您的示例执行此操作并排除路线的顶级部分。没有编译,因为我在实现定义中混淆了顺序。
  • 很高兴一切都解决了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多