Pergunta

Eu estou usando Restlet e eu criei um recurso. Eu lidar com POST, substituindo método acceptRepresentation.

O cliente deve enviar-me alguns dados, então eu armazená-lo a DB, a resposta definido para 201 (SUCCESS_CREATED) e eu preciso retornar alguns dados para o cliente, mas tipo de retorno de acceptRepresentation é void.

No meu caso, eu preciso retornar algum identificador para que o cliente pode acessar esse recurso.

Por exemplo, se eu tivesse um recurso com URL /resource e o cliente envia POST solicitar eu adicionar uma nova linha na DB e seu endereço deve ser /resource/{id}. Eu preciso enviar {id}.

Estou fazendo algo errado? princípios repousa permitem retornar algo após o POST? Se sim, como posso fazê-lo, e se não, qual é a maneira de lidar com esta situação?

Foi útil?

Solução

resto só diz que você deve estar de acordo com a interface uniforme. Em outras palavras, ele diz que você deve fazer o POST é suposto fazer de acordo com a HTTP especificação . Aqui está a citação de que especificação que é relevante,

Se um recurso foi criado no servidor de origem, a resposta deve estar 201 (Criado) e contêm uma entidade que descreve o estado da solicitar e refere-se ao novo recursos, e um cabeçalho Localização (Ver secção 14,30).

Como você pode ver a partir deste, você tem dois lugares onde você pode indicar ao cliente onde reside o recurso recém-criados. O cabeçalho Localização deve ter uma URL que aponta para o novo recurso e você pode retornar uma entidade com os detalhes também.

Eu não tenho certeza qual é a diferença entre substituindo acceptRepresentation () e substituindo pós (), mas este exemplo mostra como retornar uma resposta de um POST.

Outras dicas

eu renunciar enviar qualquer coisa no corpo da resposta. Apenas set Localização:. Para a URL (completo) do recurso recém-criado

Sua descrição sugere que esta é exatamente a semântica você:

  1. POST uma coisa para criá-lo
  2. Respond com o suficiente para saber duas coisas:
    1. Que a criação aconteceu (o 201)
    2. Onde encontrar a coisa nova (o cabeçalho Location)

Tudo o resto é supérfluo.

Duas perguntas diferentes:

Será que o aplicativo REST suporte padrão retornar dados em um POST?

Eu não acho que RESTO proíbe explicitamente, mas o tratamento preferido é soletrado para fora na resposta de Darrel.

O quadro Restlet permitem retornar dados em um POST?

Sim, embora ele retorna vazio, em uma classe que se estende de recursos, você tem acesso total ao objeto objeto Response através do método getResponse (). Então você pode chamar getResponse (). SetEntity () com todos os dados que você deseja.

it

saída em qualquer formato é solicitada. Isso poderia ser:

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

Ou:

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

Depende do que você costuma fazer. Se eles não estão esperando os dados, eles devem simplesmente ignorá-lo, mas qualquer cliente que quer lidar com isso corretamente deve ser capaz de.

Se você responder 201 Criado com um corpo de entidade, em vez de um local de redirecionamento, então é uma boa idéia para incluir um cabeçalho Content-Location apontando para o recurso que está sendo representada na resposta.

Isso irá evitar possíveis confusões -. Em que um cliente poderia (justificadamente) assumir que a entidade resposta, na verdade, 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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top