假设我有一个RESTful,超文本驱动的服务,可以模拟冰淇淋店。为了更好地管理我的商店,我希望能够显示每种销售冰淇淋的数量和美元价值的每日报告。
似乎此报告功能可以作为名为DailyReport的资源公开。可以快速生成DailyReport,并且在服务器上实际存储报告似乎没有任何优势。我只想要一个DailyReport几天,其他日子我不关心获得DailyReport。此外,在服务器上存储DailyReports会使客户端实现变得复杂,这需要记住删除他们不再需要的报告。
DailyReport是暂时的;它的表示只能检索一次。实现这一目标的一种方法是提供一个链接“/ daily-reports”,一个POST将返回一个包含DailyReport表示的响应,列出当天销售的信息。
编辑:我们也说我确实想做一个POST请求。 DailyReport有许多不同的选项可用于创建视图,例如按字母顺序排序冰淇淋类型,按美元价值 - 或包括每小时分解 - 或可选地包括当天的温度 - 或过滤掉某些冰淇淋类型(作为列表)。我不是将查询参数与GET一起使用,而是使用适当的选项POST一个DailyReport表示(使用明确定义的自定义媒体类型来记录每个选项)。我回来的表示将显示我的选项以及报告本身。
这是考虑问题的正确方法,还是应该采用其他方法?如果正确,在实现DailyReport资源时,哪些特殊注意事项可能很重要? (例如,在POST请求后返回时设置Location头可能不合适。)
答案 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)不允许客户在日期过后检索前一天的数据。您应该为每个可用的每日报告提供唯一的资源标识符,这样客户就可以随时访问所需的信息。