2009-08-20 42 views
5

比方说,我有一个RESTful,超文本驱动的服务,模拟冰淇淋店。为了更好地管理我的商店,我希望能够显示出售每种冰淇淋的每日报告列表数量和美元价值。瞬态REST表示

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

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

编辑:我们还要说我真的想做一个POST请求。每日报告有很多不同的选项来创建一个视图,比如按字母顺序排列冰淇淋类型,按照美元价值 - 或者包括每小时分解 - 或者可选择包括当天的温度 - 或过滤某些冰淇淋类型(作为列表)。我宁愿使用适当的选项发布DailyReport表示(使用定义好的自定义媒体类型来记录每个选项),而不是使用GET参数。我得到的代表将显示我的选项以及报告本身。

这是考虑问题的正确方法,还是应该使用其他方法?如果正确,在实施DailyReport资源时可能需要特别注意什么? (例如,在POST请求之后返回时设置Location标头可能不合适)。

回答

4

如果您想要提供过去日子的日常报告,则可以将其实施为GET至/daily_reports/2009/08/20。我同意约翰米利肯在这里不需要POST - 不需要像这样的东西成为用户可创建的资源。

使每天的报告可用作其自己的URI的优点是可缓存性。

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

+0

最近做了这样的事情,除了我(至今)使'daily_report'永久重定向到永久版本。 – xenoterracide 2014-03-15 23:39:23

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> 

响应您的编辑:如果您发布报告的描述来一个网址,并取回一个临时数据集作为一个结果,那不是在休息所有。它是RPC,与SOAP相同。 RPC本身并不是一件坏事,但请不要称之为RESTful。

+0

好点。如果有几个参数可以应用于DailyReport,例如按字母顺序排列冰淇淋类型或按美元排序 - 如果我不想使用查询参数来执行此操作,该怎么办?或者,如果我希望将日期范围设置为过去24小时以外的日期范围,即更通用的报告资源?假设我不想将这些选项作为查询参数包含进来,而是作为一个完整的表示形式作为POST有效载荷发送出去?这与我正在考虑的更接近。 – 2009-08-20 22:24:53

+0

为什么你不想使用查询参数?这就是他们的存在。自定义报告范围也可以使用查询参数提供。如果参数非常复杂以至于无法在查询字符串中表示,则可能值得将它们上传到服务器,并将每日报告作为子资源。 – 2009-08-20 22:30:36

1

我认为Greg's approach是正确的。为了说明这一点,我认为你不应该提供每天变化的/daily-report资源,因为在周二的11:59运行报告将产生与周三在00:01运行不同的结果,这可能是A)混淆期望资源相同的客户,以及B)不允许客户在一天过去之后检索前一天的数据。您应该为每个可用的每日报告提供一个唯一的资源标识符,这样客户可以随时访问他们需要的信息。

+0

拥有/ TodaysWeather类型的资源相当普遍。当GET之间的资源发生变化时,客户端不应该感到惊讶。 – 2009-08-20 23:21:03

+0

我同意达雷尔的评论,只是添加正确的过期标题。获取表示当前检索时间的资源是完全有效的。如果你想让它更清楚的API消费者,你可能想要单独的URI格式: /daily-report /archive/daily-reports/2009/02/12 我确信有人会跳进来提到REST不关心URI设计,但是它们对于设计可用的API非常重要。 – 2009-08-21 20:26:13

2

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

我会做类似

POST /DailyReportRequests 

这将返回请求,包括期权的表示,当完成的报告,该报告结果中的链接。

当您拥有一组预先创建的报告时,另一个好方法是创建一个DailyReports资源,其中包含预配置报告链接的列表。 OpenSearchDescription规范允许你使用查询标签做类似的事情。