假设我要实现两个功能:
我知道我可能有两个这样的RESTful API端点
为学生注册课程: 发送POST请求到/ myapp / api / students / {id} / courses 像这样的请求正文
{ “ course_id”:26, “ is_discount”:是的, “ reg_date”:“ 2020-04-23T18:25:43.511Z” }
为该课程的学生创建付款记录: 发送POST请求到/ myapp / api / payment-records 像这样的请求正文
{ “ student_id”:204, “ course_id”:26, “数量”:500 }
我的问题是,如何仅通过调用一个RESTful终结点而不像上述那样将它们分成两个来在客户端执行一项操作(或在一项事务中)?因为例如如果由于卡系统的网络故障而无法成功付款,则应相应地回退学生注册的课程。
或者,我应该这样做吗: 发送POST请求到/ myapp / api / course-registration 像这样的请求正文?
{
course: {
"course_id": 26,
"is_discount": true,
"reg_date": "2020-04-23T18:25:43.511Z"
},
payment: {
"record_id": 1,
"student_id": 204,
"course_id": 26,
"amount": 500
}
}
答案 0 :(得分:0)
我的问题是,如何仅通过调用一个RESTful终结点而不像上面那样将它们分成两个来在客户端执行一项操作(或在一项事务中)?
您将如何在网络上做到这一点?
您将拥有一个带有用于收集学生所需所有信息的表格的网页-某些字段可能已预先填写,其他字段可能已“隐藏”,因此它们不属于介绍。提交表单后,浏览器会将所有信息收集到一个application/x-www-form-urlencoded
文档中,并将该文档包含在POST请求中,该请求的目标是表单指定的URI。
请注意,您可能也有两种较小的形式-可能是同一网页的一部分,也可能是其他地方,分别进行注册和付款。
关于目标URI的两点注意。浏览器不在乎target-uri的拼写是什么;它只是将这些信息复制到HTTP请求中。但是浏览器 会在意目标URI是否与其本地缓存中可用的内容相同。请参阅RFC 7234中invalidation的规范。
因此,您可以使用一种启发式方法来选择目标,以考虑如果POST成功,则必须刷新哪个缓存的文档,然后将该文档的标识符用作target-uri。