瞬态REST表示

时间:2009-08-20 21:53:44

标签: rest representation transient

假设我有一个RESTful,超文本驱动的服务,可以模拟冰淇淋店。为了更好地管理我的商店,我希望能够显示每种销售冰淇淋的数量和美元价值的每日报告。

似乎此报告功能可以作为名为DailyReport的资源公开。可以快速生成DailyReport,并且在服务器上实际存储报告似乎没有任何优势。我只想要一个DailyReport几天,其他日子我不关心获得DailyReport。此外,在服务器上存储DailyReports会使客户端实现变得复杂,这需要记住删除他们不再需要的报告。

DailyReport是暂时的;它的表示只能检索一次。实现这一目标的一种方法是提供一个链接“/ daily-reports”,一个POST将返回一个包含DailyReport表示的响应,列出当天销售的信息。

编辑:我们也说我确实想做一个POST请求。 DailyReport有许多不同的选项可用于创建视图,例如按字母顺序排序冰淇淋类型,按美元价值 - 或包括每小时分解 - 或可选地包括当天的温度 - 或过滤掉某些冰淇淋类型(作为列表)。我不是将查询参数与GET一起使用,而是使用适当的选项POST一个DailyReport表示(使用明确定义的自定义媒体类型来记录每个选项)。我回来的表示将显示我的选项以及报告本身。

这是考虑问题的正确方法,还是应该采用其他方法?如果正确,在实现DailyReport资源时,哪些特殊注意事项可能很重要? (例如,在POST请求后返回时设置Location头可能不合适。)

4 个答案:

答案 0 :(得分:4)

如果您想让过去几天的每日报告可用,您可以将其实施为/daily_reports/2009/08/20的GET。我同意John Millikin的观点,这里不需要POST - 这样的东西不需要像用户一样的资源。

将每天的报告作为自己的URI提供的优点是可缓存性。

编辑:一个好的解决方案可能是合并两个答案,使daily_report/成为当天数据的无缓存表示,daily_reports/yyyy/mm/dd表示可缓存的表示全天的数据。

答案 1 :(得分:2)

没有必要使用POST,因为请求报告不会更改服务器的状态。我会使用这样的资源:

GET /daily-report/

200 OK
Pragma: no-cache
<daily-report for="2009-04-20" generated-at="2009-4-20T12:13:14Z">
    <!-- contents of the report here -->
</daily-report>

响应您的编辑:如果您将报告的描述发布到URL,并检索结果的临时数据集,则根本不是REST。它是RPC,与SOAP一样。 RPC本身并不是坏事,但请不要把它称为RESTful。

答案 2 :(得分:2)

有时需要保留对报告请求的记录,在这种情况下,POST到收集资源并不是不合理的。对于需要异步处理执行的长时间运行报告,它也很有用。服务器保留这些报告请求的时间取决于您。

我会做像

这样的事情
POST /DailyReportRequests

将返回请求的表示,包括选项,以及报告完成后,指向报告结果的链接。

当您拥有一组预先设置的报告时,另一个很好的选择是创建一个包含预配置报告链接列表的DailyReports资源。 OpenSearchDescription规范允许您使用Query标记执行与此类似的操作。

答案 3 :(得分:1)

我认为Greg's approach是正确的。为了阐述它,我认为你不应该提供每日更改的/daily-report资源,因为在星期二11:59运行报告会产生与星期三00:01运行报告不同的结果,这可能是A)让期望资源相同的客户感到困惑,并且B)不允许客户在日期过后检索前一天的数据。您应该为每个可用的每日报告提供唯一的资源标识符,这样客户就可以随时访问所需的信息。