A idéia é que o corpo da resposta forneça uma página que o vincule à coisa:
201 Criado
O código de status 201 (criado) indica que a solicitação foi atendida e resultou na criação de um ou mais novos recursos. O recurso principal criado pela solicitação é identificado por um campo de cabeçalho Local na resposta ou, se nenhum campo Localização for recebido, pelo URI da solicitação efetiva.
Isso significa que você incluiria um Location
no cabeçalho de resposta que fornece a URL de onde você pode encontrar a coisa recém-criada :
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Corpo de resposta
Depois, eles mencionam o que você deve incluir no corpo da resposta :
A carga útil da resposta 201 normalmente descreve e vincula os recursos criados.
Para os humanos que usam o navegador, dê a eles algo que eles possam ver e clique para acessar o recurso recém-criado:
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: text/html
Your answer has been saved!
Click <A href="https://stackoverflow.com/a/36373586/12597">here</A> to view it.
Se a página for usada apenas por um robô, faz sentido que a resposta seja legível por computador:
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/xml
<createdResources>
<questionID>1860645</questionID>
<answerID>36373586</answerID>
<primary>/a/36373586/12597</primary>
<additional>
<resource>http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586</resource>
<resource>http://stackoverflow.com/a/1962757/12597</resource>
</additional>
</createdResource>
Ou, se você preferir:
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/json
{
"questionID": 1860645,
"answerID": 36373586,
"primary": "/a/36373586/12597",
"additional": [
"http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586",
"http://stackoverflow.com/a/36373586/12597"
]
}
A resposta é inteiramente sua; é arbitrariamente o que você gostaria.
Compatível com cache
Finalmente, há a otimização de que eu posso pré-armazenar em cache o recurso criado (porque eu já tenho o conteúdo; acabei de carregá-lo). O servidor pode retornar uma data ou ETag que eu possa armazenar com o conteúdo que acabei de enviar:
Consulte a Seção 7.2 para obter uma discussão sobre o significado e a finalidade dos campos de cabeçalho do validador, como ETag e Last-Modified, em uma resposta 201.
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/23704283/12597
Content-Type: text/html
ETag: JF2CA53BOMQGU5LTOQQGC3RAMV4GC3LQNRSS4
Last-Modified: Sat, 02 Apr 2016 12:22:39 GMT
Your answer has been saved!
Click <A href="https://stackoverflow.com/a/36373586/12597">here</A> to view it.
E ETag
s são valores puramente arbitrários. Tê-los diferentes quando um recurso é alterado (e os caches precisam ser atualizados) é o que importa. O ETag é geralmente um hash (por exemplo, SHA2). Mas pode ser um banco de dados rowversion
ou um número de revisão incremental. Qualquer coisa que mudará quando a coisa mudar.
Eu acho que a API REST atompub é um ótimo exemplo de serviço repousante. Veja o snippet abaixo na especificação atompub:
O servidor sinaliza uma criação bem-sucedida com um código de status 201. A resposta inclui um cabeçalho Location indicando o URI da Entrada de Membro da Atom Atom e uma representação dessa Entrada no corpo da resposta.
A Entrada criada e retornada pela Coleção pode não corresponder à Entrada POSTADA pelo cliente. Um servidor PODE alterar os valores de vários elementos da Entrada, como os valores atom: id, atom: updated e atom: author, e PODE optar por remover ou adicionar outros elementos e atributos, ou alterar o conteúdo e os valores dos atributos.
fonte
Em poucas palavras:
fonte
Confira HTTP: Definições de Método: POST .
fonte
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19
É apenas um valor-chave delimitado por dois pontos.
ETag: "xyzzy"
Pode ser qualquer tipo de dado de texto - geralmente incluo uma string JSON com o identificador do item criado. Só a facilidade de testar faz com que valha a pena incluir.
Neste exemplo, o identificador, a URI e o tipo do item criado são as "características e localização do recurso".
fonte
A saída é realmente dependente do tipo de conteúdo que está sendo solicitado. No entanto, no mínimo, você deve colocar o recurso criado em Local. Assim como o padrão Pós-Redirecionar-Obter.
No meu caso, deixo em branco até que seja solicitado o contrário. Como esse é o comportamento do JAX-RS ao usar o Response.created ().
No entanto, observe que navegadores e estruturas como o Angular não seguem os 201 automaticamente. Observei o comportamento em http://www.trajano.net/2013/05/201-created-with-angular-resource/
fonte
Outra resposta que eu teria para isso seria adotar uma abordagem pragmática e manter seu contrato de API REST simples. No meu caso, refatorei minha API REST para tornar as coisas mais testáveis sem recorrer a JavaScript ou XHR, apenas formulários e links HTML simples.
Para ser mais específico na sua pergunta acima, eu usaria o código de retorno
200
e a mensagem retornada conteria uma mensagem JSON que seu aplicativo pode entender. Dependendo das suas necessidades, pode ser necessário o ID do objeto recém-criado, para que o aplicativo Web possa obter os dados em outra chamada.Uma observação: no meu contrato de API refatorado, as respostas POST não devem conter dados armazenáveis em cache, pois os POSTs não são realmente editáveis; portanto, limite-os aos IDs que podem ser solicitados e armazenados em cache usando uma solicitação GET.
fonte