Uma pilha típica para um aplicativo Web é um banco de dados, um servidor com código do servidor e um usuário com um navegador com HTML / CSS / JavaScript.
Antes do extenso AJAX, o MVC no qual o controlador era o código do lado do servidor era analisado. Um servidor precisava rotear solicitações de resposta para páginas da Web dinâmicas (ou seja, soluções html modeladas como JSP e ASP). O servidor para coordenar as chamadas ao banco de dados e decidir qual página dinâmica usar para responder à solicitação de página. O resultado de tudo isso é que o servidor acabou contendo a lógica de negócios, mesmo que a lógica de negócios não esteja fortemente ligada à idéia de exibir páginas.
Agora que estamos migrando para a "Web 2.0", um servidor servidores páginas estáticas que usam JavaScript para se preencher e alterar o que estão apresentando. O pode estar no JavaScript. O JavaScript geralmente implementa um serviço RESTful, o que significa que está especificando uma consulta ao banco de dados.
Portanto, o servidor fica com as funções de servir arquivos reais e atender chamadas AJAX. E atender chamadas AJAX é apenas gerenciamento de sessões e fornecer segurança. E, na verdade, o que um usuário deve até conseguir ver são dados que devem ser especificados no banco de dados.
Então, a partir daí, o servidor deve ser relegado ao papel de um intermediário burro que apenas ocasionalmente envia algo como enviar um email ou disparar um serviço da Web? A lógica de negócios poderia viver em JavaScript (quando não é secreto) ou viver em procedimentos armazenados quando é?
Será que faz sentido combinar servidores e bancos de dados ou fazer com que soluções de ERP como a SAP funcionem como servidores?
É aqui que você entendeu errado. REST não é CRUD.
Os recursos expostos pelo REST não são seus registros do banco de dados; eles são objetos totalmente gerenciados que se comportam de acordo com sua lógica de negócios. Quando o servidor recebe um POST ou PUT, ele não deve apenas validar e armazenar. Ele precisa executar qualquer coisa apropriada para o aplicativo.
Exemplo simples: um aplicativo semelhante ao twitter recebe tweets como mensagens POST em um determinado contêiner. O servidor analisa o contexto ("quem é você?", "Qual canal é esse?") E o conteúdo ("qualquer hashtags?", Índices de texto etc.) e armazena tudo isso nas respectivas filas. Provavelmente adiciona uma referência diretamente a todos os seus seguidores.
Isso dá muito trabalho além de simplesmente adicionar o recurso ao contêiner, tudo é definido pela sua lógica de negócios. E isso pertence ao servidor.
fonte
Minhas preocupações com essa abordagem podem dever-se a um mal-entendido de seu design, portanto, fique à vontade para me abater.
no entanto, pense na escalabilidade, manutenção e segurança do produto.
Se o seu produto crescer maciçamente, o banco de dados se tornará um gargalo, portanto, embora o "desempenho" sugira colocar a lógica de negócios em procedimentos armazenados, ele carrega carga adicional da CPU no servidor de banco de dados, antecipando o dia em que o servidor atingir a capacidade máxima. Ao contrário dos servidores da Web, os bancos de dados ACID não são facilmente escalonados usando hardware paralelo. Se o seu produto nunca será tão bem sucedido, isso não é um problema.
O pensamento de manter a lógica de negócios em javascript em execução em navegadores da web, onde diferentes navegadores exigirão javascriopt diferente, várias versões de navegadores, etc ... Por que tornar esse problema mais complicado do que já é?
Como Javiar disse, porém, o uso de uma abordagem REST como uma API de banco de dados para o seu produto não é realmente sensato. É um benefício de uma interface REST que outras pessoas pensem em diferentes maneiras de usar e consultar sua interface REST. No entanto, trata-se de recursos públicos de lógica de negócios pós e não de recursos de registro de tabela de baixo nível. O pensamento de disponibilizar essas consultas de dados de baixo nível pela API HTTP soa como um pesadelo de segurança.
fonte
Embora existam muitas escolas de pensamento sobre isso, e certamente nenhuma maneira pode ser chamada de "o caminho certo" universalmente, enquanto todas as outras são "o caminho errado" universalmente, existem várias razões para isolar a lógica de negócios no lado do servidor e acesse esses objetos e serviços por meio de um serviço RESTful.
A resposta curta é que se trata principalmente de gerenciamento de riscos, monitoramento e melhoria de desempenho.
Em detalhe:
O principal motivo número 1 é a segurança. Nunca se deve confiar nos clientes para enviar algo diferente de lixo para o servidor e, mantendo os aspectos de segurança do lado do servidor, você isola o risco potencial de um usuário não autorizado danificar seu sistema. Lembre-se de que o Javascript é totalmente do lado do cliente e é trivialmente variável, portanto você NÃO PODE CONFIAR NA SAÍDA.
A razão número 2 é a separação de preocupações. Seu programador javascript pode não ser um especialista em segurança, e seu guru da segurança pode não ser tão bom em Javascript. Ao isolar a lógica de negócios da lógica de apresentação, você evita cruzar essas preocupações, pois o javascript não terá permissão para acessar recursos além dos níveis de permissão e receberá erros, cuja manipulação está dentro da previsão do programador de scripts. Da mesma forma, o responsável pela segurança não estará depurando o Javascript para ver como a segurança é mantida.
O motivo número 3 é o desempenho. A lógica comercial pode potencialmente exigir recursos de servidor e banco de dados. Ao manter essa lógica isolada dos seus elementos de interface do usuário, você pode dimensionar apenas essa parte do seu aplicativo, facilitando muito a solução de gargalos. Além disso, é muito mais fácil isolar qual processo de negócios está carregando o sistema ou o back-end do banco de dados se os processos de negócios forem executados no servidor.
Um corolário aqui é que muitas vezes vários processos de negócios usam os mesmos dados e, portanto, você pode implementar o cache no servidor para reduzir a carga geral do sistema que pode não ser possível / segura para fornecer acesso ao código do cliente.
Por fim, proponho que, para manter os padrões ACID, a Business Logic realmente precise estar no servidor. Lembro-me de manter um produto de cobrança executado no navegador da web, com apenas uma conexão de banco de dados com o servidor. Se o faturamento diário (que pode levar uma hora ou mais em um bom dia!) For interrompido, digamos, pelo fechamento ou falha do navegador, poderá levar várias horas para resolver a bagunça que ele fez no banco de dados, que foi deixado em um estado inconsistente. Lembre-se, isso também envolvia cartões de crédito; portanto, os registros de cobrança também precisavam ser verificados no processador!
A lógica de negócios do servidor é basicamente trivial para garantir atualizações ACID, já que existem estruturas para qualquer idioma para manter transações, no nível do aplicativo ou do banco de dados. Se você estiver fazendo isso por meio de várias atualizações de um cliente da Web ... você terá um estado inconsistente em algum momento e provavelmente afetará seu aplicativo.
Embora possa ser tentador pensar nos serviços RESTful como simplesmente uma maneira de acessar o banco de dados, você não deve cair nessa armadilha, pois é uma boa receita para o desastre. O modelo de objeto que você expõe por meio de um serviço RESTful pode estar relacionado ao seu banco de dados, mas deve realmente encapsular sua lógica de negócios em vez de apenas usá-lo como um mecanismo CRUD.
fonte