Это нормально для REST, чтобы вернуть контент после POST? - PullRequest
80 голосов
/ 02 декабря 2009

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

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

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

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

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

Ответы [ 5 ]

87 голосов
/ 02 декабря 2009

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

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

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

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

13 голосов
/ 07 декабря 2009

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

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

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

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

10 голосов
/ 02 декабря 2009

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

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

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

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

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

6 голосов
/ 02 декабря 2009

Выведите его в любом формате, который запрашивается. Это может быть:

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

Или:

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

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

1 голос
/ 02 декабря 2009

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