Há algumas boas respostas aqui, mas não tenho certeza de que elas o ajudarão a convencer seus colegas de trabalho. Como muitos apontaram, o que você está sugerindo não é uma mudança do design do RESTful, e acho que é a chave para incorporá-los à sua proposta.
O REST não tem a ver com garantir que sua API permita apenas o armazenamento e a recuperação de dados. Em vez disso, preocupa-se em modelar ações como recursos. Sua API deve permitir que ações sejam executadas ( afinal, é uma interface de programação de aplicativos ). A questão é como modelar essas ações.
Em vez de encontrar um termo, exemplos são provavelmente a melhor maneira de explicar isso para seus colegas de trabalho . Dessa forma, você pode mostrar como eles estão fazendo isso agora, quais problemas isso causa, uma solução que resolve o problema e como ele ainda permanece RESTful.
Vamos dar uma olhada no seu objeto Customer.
Problema:
A interface do usuário POST um cliente, mas as tabelas subseqüentes ainda não foram atualizadas. E se uma das chamadas subseqüentes falhar devido a um erro no seu código de interface do usuário (ou um plug-in de navegador com comportamento inadequado, etc.)? Agora seus dados estão em um estado inconsistente. Pode até ser um estado que quebra outras partes da sua API ou interface do usuário, sem mencionar que é simplesmente inválido. Como você se recupera? Você precisaria testar todos os estados possíveis para ter certeza de que isso não quebraria algo, mas seria difícil saber o que é possível.
Solução:
Crie um terminal de API para criar clientes. Você sabe que não deseja ter um terminal "/ customer / create" ou mesmo "/ create-customer", porque create é um verbo e violaria o REST. Então, substantivo. "/ customer-creation" pode funcionar. Agora, quando você POSTAR o objeto CustomerCreation, ele enviará todos os campos necessários para que um cliente seja totalmente criado. O nó de extremidade garantirá que os dados estejam completos e válidos (retornando 400 ou algo se falhar na validação) e pode persistir em uma única transação de banco de dados, por exemplo.
Se você também precisar de um ponto de extremidade para objetos GET / cliente, tudo bem. Você pode ter os dois. O truque é criar pontos de extremidade que atendam às necessidades dos consumidores.
Vantagens:
- Você garante que não vai acabar com o mau estado
- Na verdade, é mais fácil para os desenvolvedores da interface do usuário se eles não precisam "saber" a ordem das solicitações, questões de validação etc.
- Não é tão falador quanto uma API, reduzindo a latência de solicitações de rede
- É mais fácil testar e conceber cenários (dados ausentes / malformados da interface do usuário não são distribuídos entre solicitações, algumas das quais podem falhar)
- Permite um melhor encapsulamento da lógica de negócios
- Geralmente facilita a segurança (porque a lógica de negócios e de orquestração na interface do usuário pode ser modificada pelos usuários)
- Provavelmente reduzirá a duplicação lógica (é mais provável que você tenha mais de 2 consumidores de uma API do que mais de 2 APIs que dão acesso aos mesmos dados)
- Ainda 100% RESTful
Desvantagens:
- É potencialmente mais trabalhoso para o desenvolvedor de back-end (mas pode não ser a longo prazo)
Pode ser difícil para as pessoas entenderem esse paradigma e o que é bom se não o experimentarem. Espero que você possa ajudá-los a ver usando um exemplo do seu próprio código.
Minha própria experiência é que, quando os desenvolvedores da minha equipe começaram a implementar essa estratégia, eles viram quase imediatamente os benefícios.
Um estudo mais aprofundado:
Este artigo da thinkworks realmente me ajudou a ter a idéia de modelar ações como objetos usando exemplos práticos: https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling
Eu também sugeriria ler sobre CQRS e Event Sourcing, pois eles se preocupam exatamente com esse tipo de coisa (por exemplo, separando sua API da lógica de persistência real). Não sei como seus colegas de trabalho estariam dispostos a ler esse tipo de coisa, mas isso pode lhe dar mais clareza e ajudá-lo a explicar isso a eles.