Могут ли ответы REST API PATCH с другим ресурсом применяться для подтверждения исправления? - PullRequest
0 голосов
/ 28 мая 2020

Я работаю над сервером, разрабатывающим 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?

Есть ли другой способ, о котором я не могу придумать?

1 Ответ

0 голосов
/ 28 мая 2020

Кажется, вы пытаетесь изменить семантику PATCH , что не является хорошей идеей.

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

и publi sh будут выглядеть примерно как

GET /drafts/456
PUT /documents/123

Похоже, вы хотите достичь этого, не отправляя документы по сети, позволяя серверу управлять процессом. Обычный способ сделать это - использовать POST

POST служит многим полезным целям в HTTP, включая общую цель «это действие не стоит стандартизировать».

POST /documents/123

???
201 Created
Location: /drafts/456
POST /drafts/456

???
200 OK

Сервер будет использовать полезную нагрузку POST-запросов для разрешения любой неоднозначности, которая может возникнуть из-за наличия нескольких действий, «не требующих стандартизации».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...