REST API PATCH响应可以用不同的资源,应该应用于确认补丁吗?

问题描述 投票:0回答:1

我正在一个服务器上开发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 之前描述的方法?

还有没有其他我想不出来的方法?

rest server api-design
1个回答
0
投票

你似乎是想改变语义的 补丁这不是一个好主意。

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请求的有效载荷来解决任何可能由多个 "不值得标准化 "的动作引入的歧义。

© www.soinside.com 2019 - 2024. All rights reserved.