"Лучшая" практика для спокойного ответа POST

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

Я создаю новый ресурс сдержанно, скажем:

/books (POST)

с телом:

{
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

Я знаю, что я должен вернуть 201 (создан) с заголовком Location нового ресурса:

Location: /books/12345

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

Я часто делал такой ответ:

{
  id: 12345,
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

Я сделал это по нескольким причинам:

  • Я написал api для фреймворков front end, таких как angularjs. В моем В частном случае я использую ресурсы angular, и мне часто нужно просто идентификатор ресурса, чтобы найти его. Если я не вернул идентификатор в орган реагирования мне нужно будет разобрать его из местоположения заголовок.
  • В GET всех книг я обычно возвращаю весь объект не только id. В этом смысле мой клиентский код не должен различать где получить идентификатор из (заголовок местоположения или тело).

Теперь я сейчас действительно в серой зоне, но большинство людей говорят, что возвращение всего ресурса - это "плохая" практика. Но что, если сервер изменяет/добавляет информацию в ресурс. Он определенно добавляет идентификатор, но может также добавить другие вещи, такие как метка времени. В случае, если я не возвращаю весь ресурс, лучше ли делать POST, возвращать идентификатор, а затем клиент выполняет GET для получения нового ресурса.

Ответ 1

Возврат всего объекта к обновлению не будет казаться очень актуальным, но вряд ли можно понять, почему возвращение всего объекта при его создании будет плохой практикой в ​​обычном случае использования. Это было бы полезно, по крайней мере, легко получить идентификатор и получить отметки времени, когда это необходимо. Это фактически поведение по умолчанию, полученное при создании лесов с помощью Rails.

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

В любом случае, пока ваш API совместим, я думаю, что вы должны выбрать шаблон, который наилучшим образом соответствует вашим потребностям. Не существует правильного способа создания REST API, imo.

Ответ 2

Возврат нового объекта соответствует принципу REST "Унифицированный интерфейс - Манипулирование ресурсами через представления". Полный объект - это представление нового состояния созданного объекта.

Существует отличная ссылка на дизайн API, здесь: Рекомендации по разработке прагматичного API RESTful

Он включает ответ на ваш вопрос здесь: Обновления и создание должны возвращать представление ресурса

В нем говорится:

Чтобы пользователь API не мог снова ударить API обновленное представление, вернуть API обновленный (или созданный) представление как часть ответа.

Кажется красиво прагматичным для меня, и он вписывается в этот принцип REST, о котором я упоминал выше.