将 REST 与非 RESTful API 调用混合
Mixing REST with non RESTful API calls
我正在写 RESTful API。在大多数情况下,一切都很好,但在某些情况下,当我不处理资源时,事情就开始崩溃了。虽然有一百万种方法可以解决我面临的问题,但我正在寻找一些关于哪种方法最理想的反馈。
为简单起见,我们假设 API 是 timer
。
- 一个用户一次只能有 1 个活动
timer
。
- API 有 2 个功能端点
start
和 stop
。
- 当用户
start
设置计时器时,他们POST
一些与timer
相关的数据会创建一个新的timer
,只要他们还没有一个 timer
运行.
- 在
timer
上调用 stop
更新 timer
以将其标记为不活动。
我目前的设置如下:
开始计时:
POST /api/v1/timer
Body: [
'thing1' => 'something',
'thing2' => 'somethingelse
]
Response: 204
停止计时器:
PUT /api/v1/timer/stop
Body:
Response: 204
由于一个用户只能有 1 个 timer
活动,因此 return timer
id
似乎没有意义传统的 CRUD 调用。
我读过一些帖子建议在 stop
调用中使用 POST
方法来触发停止而不是 PUT
。我想这也有道理......当你不处理传统资源时,这真的会崩溃。
当然,我也可以将其重写为 return 一个 timer
资源,但对我来说,这会增加客户端必须跟踪 timer
id
的开销当他们想要停止(或删除)活动计时器时。
如有任何意见,我们将不胜感激。
考虑一下您将如何在网站上实现此要求。
您将查看特定于当前用户的某个网页。会有一个 link 标记的开始。您会得到 link,它会弹出一个表单,使您能够覆盖与启动计时器关联的默认参数。
当您提交表单时,浏览器会根据HTML表单处理规则构造一个请求。由于这不是一个安全的操作,该方法可能是 post,表单数据可能是 application/x-www-form-urlencoded 到消息 body.
由于更改计时器的状态可能会更改原始页面的表示,因此表单可能会告诉您提交 POST。对 POST 请求的成功响应会告诉浏览器使其缓存的原始页面表示无效。
当您重新加载该页面时,"start" link 将消失,取而代之的是 "stop" link。 link 的操作大致相同 --> 单击 link 会将您带到一个表单,将表单提交回原始页面,使先前的表示无效。当您重新加载页面时,计时器关闭并且开始 link 再次可用。
GET /DarthVaderYellowMerrigold
GET /DarthVaderYellowMerrigold/start
POST /DarthVaderYellowMerrigold
GET /DarthVaderYellowMerrigold
GET /DarthVaderYellowMerrigold/stop
POST /DarthVaderYellowMerrigold
GET /DarthVaderYellowMerrigold
您可能会做很多事情来清理它(返回新的表示以响应成功的 POST,例如,使用适当的 Content-Location headers,所以客户端不需要获取数据),但基本思想是合理的。
以机器可读的方式执行此操作,您就拥有了 REST API。
这样做主要意味着记录机器应该如何理解每个 link 的用途。 "To go to the start timer form, look for this link; to go to the stop timer form, look for that link".
您可能会单独保留 HTTP 和 URI,但是将 HTML 替换为超媒体 JSON 类型之一是合理的。或者将 link 放入 HTML headers,而不是表示中。
当然,HTML 有直接的优势,您只需走 API "by hand" 并确保使用您最喜欢的桌面浏览器一切正常。 Trade-offs 比比皆是。
我正在写 RESTful API。在大多数情况下,一切都很好,但在某些情况下,当我不处理资源时,事情就开始崩溃了。虽然有一百万种方法可以解决我面临的问题,但我正在寻找一些关于哪种方法最理想的反馈。
为简单起见,我们假设 API 是 timer
。
- 一个用户一次只能有 1 个活动
timer
。 - API 有 2 个功能端点
start
和stop
。 - 当用户
start
设置计时器时,他们POST
一些与timer
相关的数据会创建一个新的timer
,只要他们还没有一个timer
运行. - 在
timer
上调用stop
更新timer
以将其标记为不活动。
我目前的设置如下:
开始计时:
POST /api/v1/timer
Body: [
'thing1' => 'something',
'thing2' => 'somethingelse
]
Response: 204
停止计时器:
PUT /api/v1/timer/stop
Body:
Response: 204
由于一个用户只能有 1 个 timer
活动,因此 return timer
id
似乎没有意义传统的 CRUD 调用。
我读过一些帖子建议在 stop
调用中使用 POST
方法来触发停止而不是 PUT
。我想这也有道理......当你不处理传统资源时,这真的会崩溃。
当然,我也可以将其重写为 return 一个 timer
资源,但对我来说,这会增加客户端必须跟踪 timer
id
的开销当他们想要停止(或删除)活动计时器时。
如有任何意见,我们将不胜感激。
考虑一下您将如何在网站上实现此要求。
您将查看特定于当前用户的某个网页。会有一个 link 标记的开始。您会得到 link,它会弹出一个表单,使您能够覆盖与启动计时器关联的默认参数。
当您提交表单时,浏览器会根据HTML表单处理规则构造一个请求。由于这不是一个安全的操作,该方法可能是 post,表单数据可能是 application/x-www-form-urlencoded 到消息 body.
由于更改计时器的状态可能会更改原始页面的表示,因此表单可能会告诉您提交 POST。对 POST 请求的成功响应会告诉浏览器使其缓存的原始页面表示无效。
当您重新加载该页面时,"start" link 将消失,取而代之的是 "stop" link。 link 的操作大致相同 --> 单击 link 会将您带到一个表单,将表单提交回原始页面,使先前的表示无效。当您重新加载页面时,计时器关闭并且开始 link 再次可用。
GET /DarthVaderYellowMerrigold
GET /DarthVaderYellowMerrigold/start
POST /DarthVaderYellowMerrigold
GET /DarthVaderYellowMerrigold
GET /DarthVaderYellowMerrigold/stop
POST /DarthVaderYellowMerrigold
GET /DarthVaderYellowMerrigold
您可能会做很多事情来清理它(返回新的表示以响应成功的 POST,例如,使用适当的 Content-Location headers,所以客户端不需要获取数据),但基本思想是合理的。
以机器可读的方式执行此操作,您就拥有了 REST API。
这样做主要意味着记录机器应该如何理解每个 link 的用途。 "To go to the start timer form, look for this link; to go to the stop timer form, look for that link".
您可能会单独保留 HTTP 和 URI,但是将 HTML 替换为超媒体 JSON 类型之一是合理的。或者将 link 放入 HTML headers,而不是表示中。
当然,HTML 有直接的优势,您只需走 API "by hand" 并确保使用您最喜欢的桌面浏览器一切正常。 Trade-offs 比比皆是。