Imagine uma API para identificar se uma pessoa selecionou seu animal espiritual. Eles só podem ter zero ou um animal espiritual.
Atualmente:
/person/{id}/selectedSpiritAnimal
quando eles selecionam um animal retorna http 200 e {selectedAnimal:mole}
mas quando eles não têm seleção, ele retorna http 404.
Isso deixa meu animal espiritual infeliz, pois estamos representando uma preocupação válida de domínio - ainda não tendo selecionado um animal espiritual - como um erro HTTP.
Além disso, como empresa - erm Sprit-Animal-Hampers-R-us - queremos saber quando alguém não tem seleção para que possamos solicitá-la.
Qual é a melhor resposta aqui:
HTTP 200 e {selectedAnimal:null}
ou ainda mais explícito
HTTP 200 e {selectedAnimal:null, spiritAnimalSelected: false}
Ou é melhor retornar um 404? Já que muito parecido this image has not yet been uploaded
ao visualizar uma imagem on-line seria um 404. this person has not selected a spirit animal
pode ser um 404
Esta pergunta foi proposta como duplicada, mas trata de uma URL válida, caso contrário, sendo solicitada quando o aplicativo foi configurado para não permitir a alteração que a URL representa.
Considerando que aqui eu estou olhando como alguém representa um recurso em que a ausência do recurso é significativa. Ou seja, é válido que o cliente solicite a URL e a resposta é que você solicitou com êxito o recurso que representa a ausência de algo.
Portanto, isso não é 'lógica de negócios', mas uma circunstância em que a ausência de algo tem significado (pode ser que muitos de meus colegas estejam argumentando que 404 ainda está correto), mas não tenho certeza de como mapear isso para o spec.
Muito difícil escolher uma resposta. Mudei de idéia várias vezes ao longo da conversa aqui e da que está em andamento no trabalho.
O que resolve isso aqui para mim é que a especificação diz que 4xx é quando o cliente cometeu um erro . Nesse caso, o cliente foi instruído a esperar uma resposta do URL selectedSpiritAnimal, para que não tenha errado.
O consenso entre meus colegas é de que isso é um sintoma de um mau design de API
Provavelmente seria melhor simplesmente solicitar / person / {id} e retornar um conjunto de relações de link para a pessoa ... se você não receber o link / selectedSpiritAnimal (quando uma pessoa não tiver seleção), mas você chame assim mesmo, então um 404 faz sentido. Ou que você implemente respostas parciais e deixe / person / {id} retornar um documento mais completo, a menos que o cliente solicite um subconjunto dos dados