Уверен ли 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>