Уверен ли REST возвращать контент после POST?

Я использую RESTlet, и я создал ресурс. Я обрабатываю POST, переопределяя метод acceptRepresentation.

Клиент должен отправить мне некоторые данные, затем я храню его в БД, задаю ответ на 201 (SUCCESS_CREATED), и мне нужно вернуть некоторые данные клиенту, но возвращаемый тип acceptRepresentation недействителен.

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

Например, если у меня был ресурс с URL/ресурсом, и клиент отправляет запрос POST, я добавляю новую строку в БД, и ее адрес должен быть /resource/ {id}. Мне нужно отправить {id}.

Я что-то делаю неправильно? Принципы REST позволяют возвращать что-то после POST? Если да, как я могу это сделать, и если нет способа справиться с этой ситуацией?

Ответ 1

REST просто говорит, что вы должны соответствовать единому интерфейсу. Другими словами, в нем говорится, что вы должны делать то, что POST должно делать в соответствии с спецификацией HTTP. Вот цитата из этой спецификации, которая имеет значение,

Если ресурс создан на исходного сервера, ответ СЛЕДУЕТ be 201 (Создано) и содержать объект который описывает статус запросить и ссылается на новый ресурс и заголовок местоположения (см. раздел 14.30).

Как вы можете видеть из этого, у вас есть два места, где вы можете указать клиенту, где находится вновь созданный ресурс. В заголовке Location должен быть URL-адрес, указывающий на новый ресурс, и вы также можете вернуть объект с данными.

Я не уверен, какая разница между переопределением acceptRepresentation() и переопределением post(), но этого примера показывает, как вернуть ответ из POST.

Ответ 2

Я бы не отправил ничего в тело ответа. Просто установите "Местоположение": (полный) URL-адрес вновь созданного ресурса.

Ваше описание показывает, что это именно семантика, которую вы:

  • POST вещь для ее создания
  • Ответьте достаточно, чтобы знать две вещи:
    • Что произошло создание (201)
    • Где найти новое (заголовок Location)

Все остальное излишне.

Ответ 3

Два разных вопроса:

Поддерживает ли шаблон приложения REST возврат данных в POST?

Я не думаю, что REST явно запрещает это, но предпочтительное лечение изложено в ответе Даррела.

Предоставляет ли среда RESTlet возможность возврата данных в POST?

Да, хотя он возвращает void, в классе, который расширяет Resource, у вас есть полный доступ к объекту объекта Response с помощью метода getResponse(). Таким образом, вы можете вызвать getResponse(). SetEntity() с любыми данными, которые вы хотите.

Ответ 4

Вывести его в любом формате. Это может быть:

<success>
    <id>5483</id>
</success>

Или:

{ "type": "success", "id": 5483 }

Это зависит от того, что вы обычно делаете. Если они не ожидают данных, они должны просто игнорировать их, но любой клиент, который хочет правильно его обрабатывать, должен иметь возможность.

Ответ 5

Если вы отвечаете 201 Создано с телом сущности, а не с редиректом местоположения, тогда неплохо включить заголовок Content-Location, указывающий на ресурс, который представляется в ответе.

Это позволит избежать потенциальной путаницы - в которой клиент может (обоснованно) предположить, что объект ответа фактически представляет новое состояние "создателя", а не созданный ресурс.

> POST /collection
> ..new item..

< 201 Created
< Location: /collection/1354
< Content-Location: /collection/1354
< <div class="item">This is the new item that was created</div>