Estou usando RESTlet e criei um recurso. Eu lido com o POST substituindo o acceptRepresentation
método.
O cliente deve me enviar alguns dados, então eu armazeno no banco de dados, configure a resposta para 201 (SUCCESS_CREATED) e preciso retornar alguns dados ao cliente, mas o tipo de retorno acceptRepresentation
é void
.
No meu caso, preciso retornar algum identificador para que o cliente possa acessar esse recurso.
Por exemplo, se eu tivesse um recurso com URL /resource
e o cliente enviasse a solicitação POST, adiciono uma nova linha no banco de dados e seu endereço deveria ser /resource/{id}
. Eu preciso enviar {id}
.
Estou fazendo algo errado? Os princípios REST permitem retornar algo após o POST? Em caso afirmativo, como posso fazer e, em caso negativo, qual é a forma de lidar com esta situação?
Respostas:
REST apenas diz que você deve estar em conformidade com a interface uniforme. Em outras palavras, ele diz que você deve fazer o que o POST deve fazer de acordo com a especificação HTTP . Aqui está a citação dessa especificação que é relevante,
Como você pode ver, você tem dois lugares onde pode indicar ao cliente onde reside o recurso recém-criado. O cabeçalho Location deve ter um URL que aponta para o novo recurso e você também pode retornar uma entidade com os detalhes.
Não tenho certeza de qual é a diferença entre substituir acceptRepresentation () e substituir post (), mas este exemplo mostra como retornar uma resposta de um POST.
fonte
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.
Eu renunciaria a enviar qualquer coisa no corpo da resposta. Basta definir Localização: para a URL (completa) do recurso recém-criado.
Sua descrição sugere que esta é exatamente a semântica que você:
Qualquer outra coisa é supérflua.
fonte
Duas questões diferentes:
O padrão de aplicativo REST suporta o retorno de dados em um POST?
Não acho que REST o proíba explicitamente, mas o tratamento preferido é explicado na resposta de Darrel.
A estrutura RESTlet permite retornar dados em um POST?
Sim, embora ele retorne void, em uma classe que estende Resource, você tem acesso total ao objeto do objeto Response por meio do método getResponse (). Portanto, você pode chamar getResponse (). SetEntity () com quaisquer dados que desejar.
fonte
Produza em qualquer formato solicitado. Isso pode ser:
<success> <id>5483</id> </success>
Ou:
{ "type": "success", "id": 5483 }
Depende do que você costuma fazer. Se não estiverem esperando os dados, eles devem simplesmente ignorá-los, mas qualquer cliente que deseje manipulá-los adequadamente deve conseguir.
fonte
Se você responder 201 Criado com um corpo de entidade, em vez de um redirecionamento de local, é uma boa ideia incluir um cabeçalho Content-Location apontando para o recurso que está sendo representado na resposta.
Isso evitará confusão potencial - na qual um cliente poderia (justificadamente) assumir que a entidade de resposta realmente representa um novo estado do 'criador', e não o recurso criado.
> 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>
fonte