我正在一个服务器上开发REST API。
现在的结构(至少是这个问题需要知道的)是,我有一个产品集合,可以通过 GET /products
, GET /products/:id
. 我希望能够编辑这些产品,但我也希望能够制作草稿。这将是有用的保存编辑,但只有在完成后才应用它们,并使编辑的历史。
我想一个可能的方法是开发这个端点。
GET /products/:id/drafts
this will retrieve all the drafts made for this product
GET /products/:id/draft
this will retrieve the last non applied draft, if any
POST /products/:id/draft/apply
this will apply the last non applied draft, if any
在这一点上,所有的一切似乎都很好, 但我正在努力寻找一个很好的方法来处理草案的创建。我想,它可以是 POST /products/:id/drafts
但是,由于一次只能有一个草稿,所以,这个回应是否应该用 "我 "来回答?409 Conflict
如果有任何非应用的草案呢?
所以我想可能是 PATCH /products/:id
所以,如果还有未应用的草稿,那么就会被编辑,否则就会被创建。能否做到?
可以吗?PATCH /products/:id
返回草稿的表示(创建或编辑)?
是否最好是 POST
之前描述的方法?
还有没有其他我想不出来的方法?
你似乎是想改变语义的 补丁这不是一个好主意。
HTTP包含了支持远程编辑的方法;例如,如果我想改变网站主页的标题,步骤顺序可能是这样的
GET /home.html
200 OK
Content-Type: text/html
<html>...
就地取材
PUT /home.html
Content-Type: text/html
<html>...
200 OK
现在,如果 home.html
是非常大的(相对于标准HTTP头文件的大小),而我们所做的改变是非常小的,那么我们可能会希望发送一个 补丁文件 而不是发送整个大部分未修改的文件。
PATCH /home.html
Content-Type: text/prs.patch
????
200 OK
如果我们想使用通用的远程编写接口来创建一个草稿,那么我们的请求序列就会是这样的
GET /documents/123
PUT /drafts/456
和发布将看起来像
GET /drafts/456
PUT /documents/123
听起来你想要的是在不通过电报发送文件的情况下实现这一目标,让服务器来管理这一过程。 通常的方法是用 POST
POST在HTTP中起到了许多有用的作用,包括 "这个动作不值得标准化 "的一般目的。
POST /documents/123
???
201 Created
Location: /drafts/456
POST /drafts/456
???
200 OK
服务器将使用POST请求的有效载荷来解决任何可能由多个 "不值得标准化 "的动作引入的歧义。