Я думаю, что вы можете использовать метод POST или PATCH для решения этой проблемы, поскольку они обычно предназначены для этого.
Использование POST
метода обычно используется для добавления элемента при использовании в ресурсе списка, но вы также можете поддерживать несколько действий для этого метода. См. Этот ответ: Как обновить коллекцию ресурсов REST . Вы также можете поддерживать различные форматы представления для ввода (если они соответствуют массиву или отдельным элементам).
В этом случае нет необходимости определять ваш формат для описания обновления.
Использование PATCH
метода также подходит, поскольку соответствующие запросы соответствуют частичному обновлению. Согласно RFC5789 ( http://tools.ietf.org/html/rfc5789 ):
Некоторым приложениям, расширяющим протокол передачи гипертекста (HTTP), требуется функция частичной модификации ресурсов. Существующий метод HTTP PUT позволяет только полную замену документа. Это предложение добавляет новый метод HTTP, PATCH, для изменения существующего ресурса HTTP.
В этом случае вы должны определить свой формат для описания частичного обновления.
Я думаю, что в этом случае POST
и PATCH
они довольно похожи, поскольку вам действительно не нужно описывать операцию для каждого элемента. Я бы сказал, что это зависит от формата отправляемого представления.
В случае PUT
с немного менее ясно. Фактически, при использовании метода PUT
вы должны предоставить весь список. По сути, предоставленное представление в запросе будет заменять ресурсное представление списка.
У вас может быть два варианта путей к ресурсам.
- Использование пути к ресурсу для списка документов
В этом случае вам необходимо явно указать ссылку на документы с подшивкой в представлении, которое вы указываете в запросе.
Вот примерный маршрут для этого /docs
.
Содержание такого подхода могло бы быть для метода POST
:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
- Использование пути субресурсов связующего элемента
Кроме того, вы также можете рассмотреть возможность использования подмаршрутов для описания связи между документами и связующими. Подсказки относительно связи между документом и подшивкой теперь не нужно указывать в содержимом запроса.
Вот примерный маршрут для этого /binder/{binderId}/docs
. В этом случае отправка списка документов с помощью метода POST
или PATCH
прикрепление документов к связыванию с идентификатором binderId
после создания документа, если он не существует.
Содержание такого подхода могло бы быть для метода POST
:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
Что касается ответа, вам решать, какой уровень ответа и какие ошибки нужно вернуть. Я вижу два уровня: уровень статуса (глобальный уровень) и уровень полезной нагрузки (более тонкий уровень). Также вам решать, должны ли все вставки / обновления, соответствующие вашему запросу, быть атомарными или нет.
В этом случае вы можете использовать статус HTTP. Если все будет хорошо, вы получите статус 200
. Если нет, то другой статус, например, 400
если предоставленные данные неверны (например, неверный идентификатор связующего) или что-то еще.
В этом случае 200
будет возвращен статус , и ответное представление должно описать, что было сделано и где в конечном итоге возникают ошибки. ElasticSearch имеет конечную точку в своем REST API для массового обновления. Это может дать вам некоторые идеи на этом уровне: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html .
Вы также можете реализовать асинхронную обработку для обработки предоставленных данных. В этом случае возвращается статус HTTP 202
. Клиенту необходимо получить дополнительный ресурс, чтобы увидеть, что происходит.
Прежде чем закончить, я также хотел бы отметить, что спецификация OData решает проблему, касающуюся отношений между сущностями с функцией, называемой навигационными ссылками . Возможно, вы могли бы взглянуть на это ;-)
Следующая ссылка также может вам помочь: https://templth.wordpress.com/2014/12/15/designing-a-web-api/ .
Надеюсь, это поможет тебе, Тьерри
GET /docs
и получить все документы в пределах определенного связующегоGET /docs?binder_id=x
. Чтобы удалить подмножество ресурсов, яDELETE /docs?binder_id=x
должен позвонить или должен позвонитьDELETE /docs
с a{"binder_id": x}
в теле запроса? Вы когда-нибудь использовалиPATCH /docs?binder_id=x
бы пакетное обновление или простоPATCH /docs
передавали пары?Вам, вероятно, потребуется использовать POST или PATCH, потому что маловероятно, что один запрос, который обновляет и создает несколько ресурсов, будет идемпотентным.
Делать
PATCH /docs
- определенно допустимый вариант. Возможно, вам будет сложно использовать стандартные форматы исправлений для вашего конкретного сценария. Не уверен в этом.Вы можете использовать 200. Вы также можете использовать 207 - Multi Status
Это можно сделать в режиме RESTful. Ключевым моментом, на мой взгляд, является наличие некоторого ресурса, который предназначен для приема набора документов для обновления / создания.
Если вы используете метод PATCH, я бы подумал, что ваша операция должна быть атомарной. т.е. я бы не стал использовать код состояния 207, а затем сообщать об успехах и неудачах в теле ответа. Если вы используете операцию POST, тогда подход 207 является жизнеспособным. Вам нужно будет разработать собственное тело ответа для сообщения о том, какие операции выполнены успешно, а какие - нет. Я не знаю стандартизированного.
источник
This can be done in a RESTful way
вы имеете в виду обновление и НАПИСАТЬ должно быть сделано отдельно?PUT ing
PUT /binders/{id}/docs
Создать или обновить и связать отдельный документ с подшивкойнапример:
PATCH ИНГ
PATCH /docs
Создайте документы, если они не существуют, и свяжите их с подшивкаминапример:
Позже я включу дополнительные идеи, а пока, если хотите, ознакомьтесь с RFC 5789 , RFC 6902 и « Пожалуйста» Уильяма Дюрана . Запись в блоге Don't Patch Like a Idiot .
источник
docs
и связать их сbinders
. Клиент хочет создать подшивки, если они не существуют, и установить связь, если они есть. В ОДНОМ ОДНОМ ЗАПРОСЕ.В проекте, над которым я работал, мы решили эту проблему, реализовав так называемые «пакетные» запросы. Мы определили путь, по
/batch
которому принимаем json, в следующем формате:Ответ имеет код состояния 207 (Multi-Status) и выглядит так:
Вы также можете добавить поддержку заголовков в эту структуру. Мы реализовали кое-что, что оказалось полезным, а именно переменные, которые можно использовать между запросами в пакете, то есть мы можем использовать ответ от одного запроса в качестве входных данных для другого.
Facebook и Google имеют похожие реализации:
https://developers.google.com/gmail/api/guides/batch
https://developers.facebook.com/docs/graph-api/making-multiple-requests.
Когда вы хотите создать или обновить ресурс с помощью того же вызова, я бы использовал POST или PUT в зависимости от случая. Если документ уже существует, вы хотите, чтобы весь документ был:
Если вам нужно поведение из альтернативы 1, вы должны использовать POST, а если вы хотите поведение из альтернативы 2, вы должны использовать PUT.
http://restcookbook.com/HTTP%20Methods/put-vs-post/
Как уже предлагали люди, вы также можете использовать PATCH, но я предпочитаю, чтобы API был простым и не использовал лишние глаголы, если они не нужны.
источник
--batch_xxxx
. Есть ли кардинальные отличия между решениями Google и Facebook? Кроме того, насчет того, чтобы «использовать ответ от одного запроса как ввод для другого», это звучит очень интересно, не могли бы вы поделиться более подробной информацией? или какой сценарий следует использовать?