#api #rest #json-api
#API #rest #json-api
Вопрос:
Я пытаюсь создать api, который соответствует спецификации json: api.
В моем api есть три ресурса /task
, /item
и /result
. Задача имеет поля name
, description
и state
. Элемент имеет поля itemName
. A count
сохраняется на сервере для элемента, а count
возвращается, когда пользователь получает элемент с GET
запросом. Увеличивается count
на стороне сервера при обновлении элемента. Между задачей и элементом существует отношение «один ко многим». В некотором смысле элемент добавляется к задаче. При изменении состояния задач скрипт запускается на стороне сервера для выполнения некоторой обработки связанных элементов. После завершения работы скрипта выходные данные доступны в результирующем ресурсе.
Согласно спецификации, я использую POST
глагол для создания задачи и PATCH
для обновления задачи. Мне просто нужна одна конечная точка, которая обрабатывает как создание, так и обновление (добавление) элемента. Но я не уверен, какой глагол использовать? Могу ли я использовать PATCH
для обновления элемента, но также и для создания элемента, если он не существует?
Я также подумал, что, возможно, мне следует использовать PUT
глагол. Но, насколько я понимаю, этот глагол используется для простой замены ресурса, а не для его обновления. Я не думаю, что это подходит для моего пользовательского варианта, поскольку количество элементов увеличивается при обновлении, поэтому замена его — это не то, что я хочу сделать. Но счетчик обрабатывается на стороне сервера, поэтому у пользователя все равно нет возможности «заменить» счетчик.
Комментарии:
1. Я не совсем уверен, правильно ли я понимаю, что означает «создание / обновление (добавление) элемента». Вы ищете способ создать
item
и присвоить его заданномуtask
только одним запросом?2. Я предполагаю, что я здесь получаю, может
PATCH
ли глагол создать ресурс, если он еще не существует? Ссылка RFC 5789 в ответе VoiceOfUnreason предполагает, что он может «Если запрос-URI не указывает на существующий ресурс, сервер МОЖЕТ создать новый ресурс». Однако не уверен, что это допустимо в json: api.3. Я также не уверен, как вы обрабатываете только поля на стороне сервера в json: api.
count
Поле в моем примере поддерживается на стороне сервера. Клиент может получитьcount
вGET
ответе, но он никогда не сможет фактически установить значение count . Количество просто увеличивается каждый раз, когда этот элемент повторно публикуется.4. Я все еще не понял ваш вариант использования. Почему вы хотите использовать ту же конечную точку для создания ресурса, если он еще не существует, или обновить его, если он существует? Вы думаете об изменении отношения has-one, но не заботитесь о том, существовало ли оно раньше? Поля, доступные только для чтения, — это еще одна тема. Сервер может включать в ответ любые поля, которые ему нравятся. Сервер может игнорировать любое поле, включенное в запрос. Вы должны только убедиться, что включаете полный ресурс в ответ на создание или обновление ресурса, чтобы сообщить клиенту о новом значении.
Ответ №1:
насколько я понимаю, этот глагол используется для простой замены ресурса, а не для его обновления.
Это общее понимание — неправильное, но распространенное.
Реестр IANA документирует авторитетную ссылку на семантику методов http. Большинство распространенных из них определены в RFC 7231; ИСПРАВЛЕНИЕ определяется в RFC 5789.
PUT является подходящим выбором, когда тело сообщения является полным представлением того, каким вы хотите видеть ресурс. Может быть, проще подумать о «сохранении файла»; PUT описывает, как клиент ожидает, что документ будет выглядеть после его сохранения.
Уместно использовать PUT либо для обновления документа, либо для его создания, при условии, что клиент знает идентификатор документа (точно так же, как мы можем использовать save для создания файла или замены файла, но нам нужно знать имя файла).
Если вы прочтете текст спецификации, вы увидите, что, хотя семантика запроса заключается в сохранении нового представления «как есть», серверу это не требуется — сервер, в конце концов, контролирует свои собственные документы — так что есть место дляохватывайте поля, доступные только для чтения, или поля, которые должны обновляться только сервером. Вам нужно быть немного осторожным с заголовками ответов, чтобы не подразумевать, что вы сохранили представление как есть, но в остальном все должно быть в порядке.
Комментарии:
1. Не могли бы вы привести части спецификации API JSON, на которых вы основываете свой ответ? Насколько я знаю, в спецификации нигде не упоминается
PUT
. Он используетсяPOST
для создания иPATCH
обновления. В FAQ приводятся явные причиныPUT
, по которым он не используется в спецификации.