【发布时间】:2018-06-04 01:45:42
【问题描述】:
我正在使用 Servant 提供一个 API,所有这些都由 Snap 管理。在 Servant 中,很容易在 POST 请求中包含任意数据类型,假设它有一个 FromJSON 实例。例如,我可能有以下端点:
ReqBody '[JSON] RequestData :> Post '[JSON] [ResponseData]
我如何为 GET 请求做同样的事情?据我了解,我需要使用查询参数,但我的请求数据由复杂的数据类型(列表、嵌套字典)组成,这些数据类型似乎不容易读取,例如QueryParam "vals" [Int] :> Post '[JSON] [Int] 导致错误No instance for (FromHttpApiData [Int])
一种解决方法是使用具有易于阅读的请求正文的 POST 请求。但是,这会与我在 Nginx 中的缓存方案发生冲突,因为对 POST 请求的响应不是那么容易缓存的。即使我可以缓存它们,我也不想缓存所有的 post 请求,所以这将是一个混乱的方法。
感谢您的帮助!
【问题讨论】:
-
如果你不介意孤儿实例,为什么不自己为
(FromHttpApiData a) => FromHttpApiData [a]定义一个实例 -
@Probie 谢谢,对于单一请求类型,这是一种干净的方法。但是,我有很多请求类型。我需要为每个数据类型
RequestData1, RequestData2,...编写一个FromHttpApiData实例,这感觉很奇怪,所有这些都可能很复杂。由于可以自动解析 POST 请求正文,看来我应该能够重用那里使用的代码,或者是否存在阻止这样做的技术限制?
标签: haskell haskell-snap-framework servant