В REST is POST или PUT лучше всего подходит для работы upsert?

Я храню хранилище ключей на сервере для клиента. Если пользователь отправляет ключ "k1", то я вставляю его в базу данных. Это считается POST или PUT?

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

4 ответов


Если пользователь отправляет ключ "k1", я вставляю его в базу данных. Это считается постом или PUT.

по словам спецификация HTTP:

метод PUT запрашивает, чтобы вложенный объект был сохранен под предоставленным запросом-URI. Если URI-запрос ссылается на уже существующий ресурс, вложенный объект следует рассматривать как измененную версию ресурса, находящегося на исходном сервере. Если запрос-URI не указывает на существующий ресурс, и этот URI может быть определен как новый ресурс запрашивающим агентом пользователя, исходный сервер может создать ресурс с этим URI.

поэтому я думаю, что использование PUT для вставки или обновления совершенно законно, при условии, что в обоих случаях URI известен заранее. Если вы используете Ключ как часть URI (как k1 в http://www.somewhere.com/resources/k1) это должно быть так. Быть идеально спокойным, однако получение того же URL-адреса также должно позволить вам загрузить ресурс.

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

Я не думаю, что эту операцию можно считать спокойной, потому что она делает две вещи. По-видимому, он предоставляет макрос для удовлетворения потребностей конкретного клиента, а не простой доступ к данным. Стандартный дизайн RESTful был бы

  1. получение списка ключей путем отправки GET на родительский URL. В приведенном выше примере, это будет http://www.somewhere.com/resources;
  2. удаление каждого из этих ключей, отправив удалить http://www.somewhere.com/resources/k1;
  3. добавление замены путем отправки PUT в http://www.somewhere.com/resources/k2.

это менее ясно, но я думаю, что это также будет законное, чтобы удалить все ресурсы, отправив один запрос удалить http://www.somewhere.com/resources.


идея операции upsert заключается в том, что клиенты имеют информацию о структуре данных и отправке данных с ключевым значением. Таким образом, модель запроса для операции upsert очень похожа на операцию обновления с ключом, включенным в качестве примера ниже:

/customers/jimmy

ставится ожидаемый метод обновления существующей записи. Поэтому ваш выбор должен быть поставлен.

POST обычно используется для вставки новой записи с совершенно новым контентом, как в Примере ниже:

POST /customers HTTP/1.1
Content-Type: ...
Content-Length: ...
Host: server.yourdomain.com
Accept: ...
User-Agent: ...

id      jimmy
name    jimmy
Occupation   Stackoverflower

поэтому в вашем случае вам не нужна никакая операция POST, потому что PUT для операции upsert также охватывает это.

здесь критический вопрос об upsert заключается в том, насколько вероятно, что Вы доверяете своему клиенту об операции upsert. Если клиент желает вставить новую запись с существующим ключом, что происходит? В вашем случае вы должны обработать этот запрос как обновление, потому что запросы вставки и обновления поступают в один и тот же api, и у вас есть существующая запись. Это вопрос, на который нужно ответить на вашей стороне о дизайне.


ответ Полли шоу правильный, но я хотел бы упомянуть, что, учитывая, что сообщение, скорее всего, может быть неполным (отсутствует идентификатор, когда ресурс еще не создан), a патч глагол был бы немного более правильным.

https://tools.ietf.org/html/rfc5789

Это очень тонкая настройка.


если вы смешиваете все, вы, вероятно, не отдыхаете. От RESTful веб-службы: основы POST и PUT имеют отдельный сценарий использования:

To create a resource on the server, use POST.
To retrieve a resource, use GET.
To change the state of a resource or to update it, use PUT.
To remove or delete a resource, use DELETE.

так считают POST Как разместить новый билет в блог и PUT для изменения существующего значения.

удаление должно быть сделано как отличительная операция с DELETE глагол. Как "удалить все" перед обновлением не звучит как хорошая идея.