Скажем, я хочу иметь ресурс RESTful для людей, которому клиент может назначать идентификатор.
Выглядит человек так: {"id": <UUID>, "name": "Jimmy"}
Теперь, как клиент должен сохранить (или «ПОСТАВИТЬ») его?
PUT /person/UUID {"id": <UUID>, "name": "Jimmy"}
- теперь у нас есть это неприятное дублирование, которое мы должны постоянно проверять: совпадает ли идентификатор в теле с идентификатором в пути?- Асимметричное представление:
PUT /person/UUID {"name": "Jimmy"}
GET /person/UUID
возвращается{"id": <UUID>, "name": "Jimmy"}
- В теле нет ID - ID только в локации:
PUT /person/UUID {"name": "Jimmy"}
GET /person/UUID
возвращается{"name": "Jimmy"}
- Это не
POST
кажется хорошей идеей, поскольку идентификатор генерируется клиентом.
Каковы общие закономерности и способы ее решения? Использование идентификаторов только в местоположении кажется наиболее догматически правильным способом, но также усложняет практическую реализацию.
id
TO с идентификаторами и объектами, дополнительными конвертерами и слишком большими накладными расходами для программистов.Если это общедоступный API, вы должны быть консервативны, когда отвечаете, но соглашайтесь свободно.
Под этим я подразумеваю, что вы должны поддерживать и 1, и 2. Я согласен, что 3 не имеет смысла.
Способ поддержки как 1, так и 2 состоит в том, чтобы получить идентификатор из URL-адреса, если он не указан в теле запроса, и если он находится в теле запроса, затем проверить, соответствует ли он идентификатору в URL-адресе. Если они не совпадают, вернуть ответ 400 Bad Request.
При возврате ресурса person будьте консервативны и всегда включайте идентификатор в json, даже если он не является обязательным в put.
источник
Одно из решений этой проблемы включает в себя несколько сбивающую с толку концепцию «Гипертекст как механизм состояния приложения» или «HATEOAS». Это означает, что ответ REST содержит доступные ресурсы или действия, которые необходимо выполнить, в виде гиперссылок. При использовании этого метода, который был частью первоначальной концепции REST, уникальные идентификаторы / идентификаторы ресурсов сами являются гиперссылками. Так, например, у вас может быть что-то вроде:
Затем, если вы хотите обновить этот ресурс, вы можете сделать (псевдокод):
Одним из преимуществ этого является то, что клиент не должен иметь никакого представления о внутреннем представлении идентификаторов пользователей на сервере. Идентификаторы могут измениться, и даже сами URL-адреса могут измениться, если у клиента есть способ их обнаружить. Например, при получении коллекции людей вы можете вернуть такой ответ:
(Вы можете, конечно, также вернуть полный объект person для каждого человека, в зависимости от потребностей приложения).
Используя этот метод, вы думаете о своих объектах больше с точки зрения ресурсов и местоположений, а не с точки зрения идентификатора. Таким образом, внутреннее представление уникального идентификатора отделено от вашей клиентской логики. Это было первоначальным стимулом для REST: создавать архитектуры клиент-сервер, которые более слабо связаны, чем системы RPC, которые существовали раньше, с использованием функций HTTP. Для получения дополнительной информации о HATEOAS, посмотрите статью в Википедии, а также эту короткую статью .
источник
Во вставке вам не нужно добавлять идентификатор в URL-адрес. Таким образом, если вы отправляете идентификатор в PUT, вы можете интерпретировать его как UPDATE для изменения первичного ключа.
ВСТАВИТЬ:
ОБНОВИТЬ
JSON API использует этот стандарт и решают некоторые проблемы , возвращающихся вставленный или обновленный объект со ссылкой на новый объект. Некоторые обновления или вставки могут включать некоторую бизнес-логику, которая изменяет дополнительные поля.
Вы также увидите, что вы можете избежать получения после вставки и обновления.
источник
Об этом уже спрашивали - стоит взглянуть на обсуждение:
Должен ли ответ RESTful GET возвращать идентификатор ресурса?
Это один из тех вопросов, по которым легко увязнуть в дебатах о том, что есть, а что нет .
Как бы то ни было, я стараюсь мыслить категориями согласованных ресурсов и не менять их структуру между методами. Однако, IMHO, самое важное с точки зрения удобства использования - это то, что вы единообразны во всем API!
источник
Хотя можно иметь разные представления для разных операций, общая рекомендация для PUT - содержать ВСЕ полезные данные . Значит,
id
это тоже должно быть. В противном случае вам следует использовать PATCH.Сказав это, я думаю, что PUT в основном следует использовать для обновлений, и его также
id
следует всегда передавать в URL-адресе. В результате использование PUT для обновления идентификатора ресурса - плохая идея. Это оставляет нас в нежелательной ситуации, когдаid
URL-адрес может отличаться от URL-адресаid
в теле.Итак, как нам разрешить такой конфликт? В основном у нас есть 2 варианта:
Warning
(иX-API-Warn
т. д.).Это настолько близко, насколько я могу ответить на этот вопрос, потому что в целом тема - это вопрос мнения.
источник
В использовании разных подходов нет ничего плохого. но я думаю, что лучший способ - это решение со вторым .
он в основном используется таким образом, даже если структура сущностей использует этот метод, когда сущность добавляется в dbContext, класс без сгенерированного идентификатора - это идентификатор, созданный по ссылке в Entity Framework.
источник
Я смотрю на это с точки зрения JSON-LD / Semantic Web, потому что это хороший способ добиться реального соответствия REST, как я обрисовал на этих слайдах . Глядя на это с этой точки зрения, нет никаких сомнений в том, чтобы выбрать вариант (1.), поскольку идентификатор (IRI) веб-ресурса всегда должен быть равен URL-адресу, который я могу использовать для поиска / разыменования ресурса. Я думаю, что верификацию нетрудно реализовать, и она не требует больших вычислений; поэтому я не считаю это веской причиной для выбора варианта (2.). Я думаю, что вариант (3.) на самом деле не вариант, поскольку POST (создать новый) имеет другую семантику, чем PUT (обновление / замена).
источник
Просто к вашему сведению, ответы здесь неправильные.
Увидеть:
https://restfulapi.net/rest-api-design-tutorial-with-example/
https://restfulapi.net/rest-put-vs-post/
https://restfulapi.net/http-methods/#patch
СТАВИТЬ
ПАТЧ
Итак, вы должны использовать его таким образом:
Практика RESTful показывает, что не имеет значения, что вы ПОСТАВЛЯЕТЕ в / {id} - содержимое записи должно быть обновлено до того, которое предоставляется полезной нагрузкой, - но GET / {id} все равно должен ссылаться на тот же ресурс.
Другими словами, PUT / 3 может обновить идентификатор полезной нагрузки до 4, но GET / 3 должен по-прежнему связываться с той же полезной нагрузкой (и возвращать тот, у которого идентификатор установлен на 4).
Если вы решаете, что вашему API требуется один и тот же идентификатор в URI и полезной нагрузке, ваша задача - убедиться, что он совпадает, но обязательно используйте PATCH вместо PUT, если вы исключаете идентификатор в полезной нагрузке, которая должна быть там полностью . Вот где принятый ответ ошибся. PUT должен заменить весь ресурс, в то время как исправление может быть частичным.
источник
transformation applied to the body
. Есть даже механизм для клиентаallows a user agent to know when the representation body it has in memory remains current
, которым является серверMUST NOT send ... an ETag or Last-Modified ... unless the request's representation was saved without any transformation
.Возможно, вам придется изучить типы запросов PATCH / PUT.
Запросы PATCH используются для частичного обновления ресурса, тогда как в запросах PUT вы должны отправить весь ресурс, где он будет переопределен на сервере.
Что касается наличия идентификатора в URL-адресе, я думаю, вы всегда должны иметь его, поскольку это стандартная практика для идентификации ресурса. Так работает даже Stripe API.
Вы можете использовать запрос PATCH для обновления ресурса на сервере с идентификатором, чтобы идентифицировать его, но не обновлять фактический идентификатор.
источник