混合REST与非RESTful API调用

时间:2019-02-06 16:51:59

标签: php laravel rest https crud

我正在编写RESTful API。在大多数情况下,一切工作都很好,但是在某些情况下,当我不处理资源时,事情就会开始崩溃。尽管有上百万种方法可以解决我所面临的问题,但我正在寻找一些反馈,以了解哪种方法最理想。

为简单起见,我们将API称为timer

  • 用户一次只能有1个有效的timer
  • API具有2个功能端点startstop
  • 当用户start定时器时,他们POSTtimer相关的一些数据,只要他们还没有{ {1}}正在运行。
  • timer上调用timer会更新stop,以将其标记为无效。

我目前的设置如下:

启动计时器:

timer

停止计时器:

timer

由于用户只能激活1个POST /api/v1/timer Body: [ 'thing1' => 'something', 'thing2' => 'somethingelse ] Response: 204 ,因此像在更传统的CRUD调用中那样返回PUT /api/v1/timer/stop Body: Response: 204 timer似乎没有意义。

我已经阅读了一些建议在timer调用中使用id方法来触发停止而不是POST的帖子。我想这也是有道理的……当您不使用传统资源时,这真的会崩溃。

当然,我也可以重写它以返回stop资源,但对我来说,这增加了客户端的开销,因此当客户想要停止PUT timer时,或删除)活动计时器。

在这里的任何输入将不胜感激。

1 个答案:

答案 0 :(得分:0)

考虑如何在网站上实施此要求。

您将在查看某些特定于当前用户的网页。将有一个标记为开始的链接。您将获得该链接,并且它将弹出一个表格,该表格使您能够覆盖与启动计时器相关的默认参数。

提交表单时,浏览器将基于HTML表单处理规则构造一个请求。由于这不是安全操作,因此该方法可能是发布,并且表单数据将被application / x-www-form-urlencode编码到消息正文中。

由于更改计时器的状态可能会更改原始页面的表示形式,因此表单很可能会告诉您提交POST。对POST请求的成功响应将告诉浏览器使其对原始页面的缓存表示形式无效。

重新加载该页面时,“开始”链接将消失,而将出现“停止”链接。该链接的操作几乎相同->单击该链接将带您到一个表单,将该表单提交回原始页面,从而使先前的表示形式无效。当您重新加载页面时,计时器关闭,并且开始链接再次可用。

GET /DarthVaderYellowMerrigold

GET /DarthVaderYellowMerrigold/start
POST /DarthVaderYellowMerrigold
GET /DarthVaderYellowMerrigold

GET /DarthVaderYellowMerrigold/stop
POST /DarthVaderYellowMerrigold
GET /DarthVaderYellowMerrigold

您可以采取多种措施来清除此错误(例如,通过成功的POST返回新的表示形式,例如,使用适当的Content-Location标头,这样客户端就不需要提取数据了) ,但基本思路是合理的。

以机器可读的方式进行操作,您将获得一个REST API。

多数情况下,这样做意味着记录机器应该如何理解每个链接的用途。 “要转到开始计时器表单,请查找此链接;要转到停止计时器表单,请查找该链接”。

您可能会保留HTTP和URI,但是用例如超媒体JSON类型之一替换HTML是合理的。或将链接放在HTML标头中,而不是在表示形式中。

当然,HTML具有直接的优势,您可以“手动”浏览API,并确保使用您喜欢的桌面浏览器都能正常工作。权衡比比皆是。