Нормально ли REST возвращать контент после публикации?

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

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

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

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

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

5 ответов


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

Если ресурс был создан на сервер происхождения, ответ должен быть 201 (создан) и содержать сущность который описывает состояние запрос и ссылается на новый ресурсов, и заголовок Location (видеть раздел 14.30).

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

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


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

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

  1. разместить вещь, чтобы создать его
  2. ответить достаточно знать две вещи:
    1. что творение произошло (201)
    2. где найти новую вещь (расположение заголовок)

все остальное-лишнее.


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

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

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

позволяет ли платформа RESTlet возвращать данные в сообщении?

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


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

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

или:

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

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


Если вы отвечаете на 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>