HTTP-глагол для добавления к ресурсному объекту?

#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 , по которым он не используется в спецификации.