Farei essa pergunta dessa maneira - quais são as preocupações de engenharia de software por não implementar minha API REST da maneira "correta"?
O que você quer dizer com o caminho "certo"? Bem, permita-me explicar minha percepção do caminho certo, depois eu direi como estou fazendo isso (também, assuma que estou falando de uma API JSON REST).
O caminho certo
Apatridia. Esta é a parte que recebo. O cliente mantém o estado sempre 100% do tempo para sempre. Não é o trabalho do servidor, é o cliente.
As ações e respostas esperadas para cada verbo:
- GET - Obtém um recurso especificado na íntegra, limitado apenas pela autorização na solicitação ou por um parâmetro de consulta. Isso garante nenhuma modificação de qualquer recurso no processo.
- POST - Dada uma descrição completa do recurso (como um objeto JSON), cria um recurso e, em seguida, retorna esse recurso, com todas as propriedades do servidor também criadas, como datas ou IDs.
- DELETE - Exclui um recurso especificado, fornecendo apenas 200 OK como resposta
- PUT - Dada uma declaração de objeto inteira como entrada, atualiza o recurso em um local específico, atualizando todos os campos do recurso para cada um dos campos fornecidos na entrada. Para ficar claro, isso espera que todo o objeto seja passado como entrada. Todo o recurso atualizado é retornado, com todos os campos (de acordo com a autorização ou qualquer outro sinalizador de entrada).
- PATCH - Dado apenas os campos que desejam ser modificados para um recurso, atualiza apenas os campos em um recurso especificado que são fornecidos como entrada. (Aqui é onde não estou claro): O recurso inteiro é retornado? (Ou são apenas os campos atualizados? Não sei. Não ligue.)
- Caminhos de recursos. Dado o relacionamento dos recursos entre si, um caminho de recurso pode se parecer com um dos seguintes:
- / parentresource /: id
- / parentresource /: id / childresource
- / parentresource /: id / childresource /: childId
- / parentresource /: id / childresource /: childId / subresource /: subresourceId (neste exemplo, um subresource pertence a um childresource, que pertence a um recurso pai).
Do jeito que eu quero fazer
A descrição acima é minha compreensão de como uma API REST deve funcionar. Agora, deixe-me listar algumas das minhas variações para o acima:
- PUT / PATCH - Qual o sentido de passar todo o recurso para modificação? Uso apenas PUTs para modificar recursos e passo apenas nos campos que quero atualizar. Como resultado, não preciso usar PATCH
Caminhos de recursos - eu uso GUIDs no meu aplicativo. Como resultado, eles serão globalmente únicos. Por que preciso do caminho completo dos recursos, incluindo os recursos pai, se posso apenas me referir exclusivamente a um sub-recurso? Como:
/ subresource /: subresourceId
Se eu fizesse isso da maneira "correta", tentar fazer referência ao subresource exigiria um caminho completo como:
/ parentresource /: id / childresource /: childId / subresource /: subresourceId
É tudo o que é necessário ? Porque agora eu tenho que ter um tratamento de erro adicional se meu caminho contiver um: subresourceId que não seja realmente de propriedade de um determinado: childId e o mesmo para um: childId que não seja de propriedade de um pai: id. Meu servidor está cuidando da autorização de recursos. Não posso apenas referenciar o recurso em si, e não o caminho completo?A resposta de retorno. Digamos, por exemplo, que minha estrutura de dados é uma árvore hierárquica, sem limites práticos na profundidade da árvore. Os recursos estão em diferentes níveis abaixo da árvore, de maneira hierárquica.
- O GET é óbvio. Se eu receber essa árvore inteira, espero que a árvore inteira seja uma resposta, com os recursos contidos nos recursos.
- Se eu POST para criar um novo recurso, PUT para atualizar ou DELETE para remover, desejo ver os deltas na árvore, em vez de apenas ver o recurso que eu criei / atualizei / excluí. Não quero ter que chamar novamente o GET da árvore pai após cada POST, PUT ou DELETE, especialmente se houver pequenas alterações na árvore e eu apenas desejar ver os deltas.
Espero que minhas perguntas sejam claras.
Se você visse uma implementação REST como a descrevi, você a observaria e me contaria suas preocupações de engenharia de software? Se sim, quais seriam?