Ao projetar uma API, deparamos com a questão de saber se uma carga útil de PUT deve conter o ID do recurso que está sendo atualizado.
É o que temos atualmente:
PUT /users/123 Payload: {name: "Adrian"}
Nosso código de rota extrai o ID do URI e continua com a atualização.
Os primeiros usuários de nossa API estão questionando por que não permitimos o ID na carga útil:
PUT /users/123 Payload: {id: 123, name: "Adrian"}
O motivo de não permitirmos isso é porque o ID é duplicado, na carga útil e no URI.
Pensando nisso um pouco mais, estamos acoplando o recurso ao URI.
Se o URI não tiver o ID, a carga útil precisará ser alterada:
PUT /no/id/here Payload: {name: "Adrian"} < What user???
Há alguma razão para não?
/users
(não é necessário adicionar 'novo').A resposta a esta pergunta depende se você deseja permitir que o cliente altere o ID?
Se o cliente puder alterar o ID, via PUT, o URI do recurso será alterado, e você deverá fornecer um 301 Movido Permanentemente sempre que um recurso acessar o URI antigo.
Por exemplo, você começa com um recurso em
e o cliente coloca o seguinte no recurso
o recurso foi atualizado e seu URI está agora
O
Location
campo na resposta PUT deve conter o novo URI e, se você for,/users/123
deverá obter uma301
resposta com o campo Localização apontando para o novo/users/222
recurso.Na maioria dos casos, na verdade, você não deseja que o cliente possa alterar o ID, pois isso pode ficar muito confuso rapidamente. Nesse caso, o ID é algo que apenas o servidor pode alterar e você deve deixá-lo fora do corpo PUT, pois o cliente não pode atualizar esse estado.
Se você colocar um requerimento para um URI diferente no mesmo recurso, diga
então, se esse recurso não existir, o servidor deve criá-lo e criar e ID quando estiver fazendo isso
fonte