Я использую RESTlet и создал ресурс. Я обрабатываю POST методом переопределения acceptRepresentation
.
Клиент должен отправить мне некоторые данные, затем я сохраняю их в БД, устанавливаю ответ на 201 (SUCCESS_CREATED), и мне нужно вернуть некоторые данные клиенту, но тип возврата acceptRepresentation
есть void
.
В моем случае мне нужно вернуть какой-то идентификатор, чтобы клиент мог получить доступ к этому ресурсу.
Например, если у меня есть ресурс с URL-адресом, /resource
и клиент отправляет запрос POST, я добавляю новую строку в БД, и ее адрес должен быть /resource/{id}
. Мне нужно отправить {id}
.
Я делаю что-то неправильно? Принципы REST позволяют вернуть что-либо после POST? Если да, как я могу это сделать, а если нет, как мне разрешить эту ситуацию?
Ответы:
REST просто говорит, что вы должны соответствовать единому интерфейсу. Другими словами, в нем говорится, что вы должны делать то, что должен делать POST в соответствии со спецификацией HTTP . Вот цитата из этой спецификации, которая актуальна,
Как видно из этого, у вас есть два места, где вы можете указать клиенту, где находится вновь созданный ресурс. Заголовок Location должен иметь URL-адрес, указывающий на новый ресурс, и вы также можете вернуть объект с подробностями.
Я не уверен, в чем разница между переопределением acceptRepresentation () и переопределением post (), но в этом примере показано, как вернуть ответ из POST.
источник
Request and Response messages MAY transfer an entity if not otherwise restricted by the request method or response status code. An entity consists of entity-header fields and an entity-body, although some responses will only include the entity-headers.
Я бы отказался от отправки чего-либо в теле ответа. Просто установите Location: на (полный) URL-адрес вновь созданного ресурса.
Ваше описание предполагает, что это именно та семантика, которую вы:
Все остальное - лишнее.
источник
Два разных вопроса:
Поддерживает ли шаблон приложения REST возврат данных в POST?
Я не думаю, что REST явно запрещает это, но предпочтительное лечение указано в ответе Даррела.
Позволяет ли структура RESTlet возвращать данные в POST?
Да, даже если он возвращает void, в классе, расширяющем Resource, у вас есть полный доступ к объекту объекта Response через метод getResponse (). Таким образом, вы можете вызвать getResponse (). SetEntity () с любыми данными, которые вам нужны.
источник
Выведите его в любом запрошенном формате. Это может быть:
<success> <id>5483</id> </success>
Или:
{ "type": "success", "id": 5483 }
Это зависит от того, что вы обычно делаете. Если они не ожидают данных, они должны просто игнорировать их, но любой клиент, который хочет обработать их должным образом, должен иметь возможность.
источник
Если вы отвечаете 201 Created с телом объекта, а не с перенаправлением Location, то рекомендуется включить заголовок 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>
источник