端点设计上的RESTful API最佳做法

时间:2020-06-25 01:49:04

标签: api rest

假设我要实现两个功能:

  1. 注册课程
  2. 支付课程费用

我知道我可能有两个这样的RESTful API端点

  1. 为学生注册课程: 发送POST请求到/ myapp / api / students / {id} / courses 像这样的请求正文

    { “ course_id”:26, “ is_discount”:是的, “ reg_date”:“ 2020-04-23T18:25:43.511Z” }

  2. 为该课程的学生创建付款记录: 发送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
  }
}

1 个答案:

答案 0 :(得分:0)

我的问题是,如何仅通过调用一个RESTful终结点而不像上面那样将它们分成两个来在客户端执行一项操作(或在一项事务中)?

您将如何在网络上做到这一点?

您将拥有一个带有用于收集学生所需所有信息的表格的网页-某些字段可能已预先填写,其他字段可能已“隐藏”,因此它们不属于介绍。提交表单后,浏览器会将所有信息收集到一个application/x-www-form-urlencoded文档中,并将该文档包含在POST请求中,该请求的目标是表单指定的URI。

请注意,您可能也有两种较小的形式-可能是同一网页的一部分,也可能是其他地方,分别进行注册和付款。

关于目标URI的两点注意。浏览器不在乎target-uri的拼写是什么;它只是将这些信息复制到HTTP请求中。但是浏览器 会在意目标URI是否与其本地缓存中可用的内容相同。请参阅RFC 7234中invalidation的规范。

因此,您可以使用一种启发式方法来选择目标,以考虑如果POST成功,则必须刷新哪个缓存的文档,然后将该文档的标识符用作target-uri。