REde apresentação Sestado Transferência, comumente conhecida como "REST", descreve um padrão para comunicação programática com serviços de dados de back-end pela Web.
Uma API REST é uma interface de programação que usa solicitações HTTP para POST (criar), GET (ler), PUT (atualizar) e DELETE dados (conhecidos como "operações CRUD") por meio de um endpoint de URL básico semelhante a https://sample.com/api/products. Os desenvolvedores criam aplicativos que interagem com a API por meio de solicitações HTTP para o ponto de extremidade.
Pense nos pontos de extremidade da API REST como encapsulamentos de consultas que são expostas para que os desenvolvedores interajam com uma fonte de dados. A abstração da complexidade facilita o uso da REST - é apenas um URL, mas lembre-se de que somente as consultas que os autores da API pensaram e expuseram estão disponíveis para as massas; a manipulação de dados além dessas consultas requer programação.
Devido à sua simplicidade e ao fato de que quase todas as principais soluções de software oferecem acesso REST, o aproveitamento das APIs REST para dados tornou-se uma abordagem popular para o desenvolvimento de aplicativos Web.
Por que REST em primeiro lugar?
As APIs REST são uma ótima opção para muitos aplicativos, especialmente os menos complexos, com requisitos básicos para buscar e atualizar registros.
Por exemplo, um aplicativo que mostra "locais perto de mim" para um varejista pode passar as coordenadas de localização do usuário para um endpoint REST, como "https://sample.com/api/locations/?=___", que retorna endereços de lojas em um determinado raio daquele local. Todas as informações que o aplicativo precisa para o recurso "locais próximos a mim" são fornecidas por meio de um simples OBTER chamada. Por esses tipos de motivos, o REST é bom quando as necessidades de dados do aplicativo podem ser atendidas com acesso geral às entidades.
Mas se o seu aplicativo exigir mais lógica para o manuseio de dados, como aqueles que modificam frequentemente entidades como usuários, contas ou inventários, você provavelmente precisará de um controle mais granular dos dados do que muitas APIs REST podem oferecer. Isso força os desenvolvedores a situações em que precisam codificar em torno das limitações do REST para obter os dados precisos que o aplicativo exige, fazendo coisas como filtrar e mesclar dados no código, o que leva mais tempo e inevitavelmente reduz a eficiência do aplicativo.
Além disso, como o aplicativo é móvel, você também precisa lidar com problemas de conectividade ao depender de APIs REST na Web para obter dados, o que não é uma tarefa trivial.
É aqui que você provavelmente começará a enfrentar os pontos problemáticos da API REST...
Pontos problemáticos do uso do REST
Falta de validação do esquema e do tipo de dados
Cada API REST é criada especificamente para as entidades que expõe e, portanto, não há um protocolo padrão para validação de esquema ou tipos de dados esperados. Isso significa que os desenvolvedores devem estar cientes desses detalhes e contorná-los, ou sofrer as consequências em termos de instabilidade e falhas no aplicativo.
Por exemplo, você pode enviar uma solicitação de uma lista de produtos usando "GET /produtos", mas não há como validar se o endpoint existe. Isso é especialmente problemático quando você usa um endpoint que estava disponível em versões anteriores de uma API que não está mais disponível em versões mais recentes.
E mesmo que o endpoint exista, não há como validar os detalhes da entidade que ele retorna. Por exemplo, um determinado produto na lista de produtos retornada pode ter sido modificado ou excluído por outro cliente desde que a lista foi solicitada.
Os tipos de dados também podem ser diferentes para os mesmos dados entre os endpoints, dependendo de como cada um foi implementado. Por exemplo, essas duas solicitações de endpoint retornarão os mesmos dados, mas com pequenas diferenças:
Solicitação | Resposta |
GET /produtos/123 | { Preço: 10,95, Moeda: "USD" } |
GET /inventory/product/123 | { Preço: "10.95", Moeda: "USD" } |
Neste exemplo, uma resposta retorna o preço do produto como double e a outra retorna o preço do produto como uma string. Esses são os tipos de incompatibilidade de tipos de dados que podem causar instabilidade ou falha nos aplicativos.
Transformação de dados de ida e volta
A manipulação de tipos de dados requer um ciclo interminável de transformação dos dados da entidade no que cada extremidade da conexão espera. Por exemplo, para que um aplicativo aproveite uma API REST, o fluxo de comunicação seria mais ou menos assim:
|
|
2. Serializar dados em JSON |
|
3. Transporte via HTTP |
|
4. Decodificar dados no backend |
|
5. Operação CRUD no banco de dados |
|
Em todo o fluxo do processo, os dados são transformados repetidamente à medida que passam do banco de dados para o aplicativo e vice-versa. É nesse ponto que há o maior risco de uma solicitação ou resposta conter dados que a outra parte não está esperando, levando à instabilidade ou a uma falha. E o problema só é exacerbado pela falta de validação de esquema e digitação rigorosa de dados no REST.
Tradução da lógica do domínio comercial para um modelo de transporte simples
Se você desenvolver seguindo o modelo de domínio, projetará entidades cuidadosa e intencionalmente para atender aos requisitos de recursos do produto e seguir a lógica comercial dos casos de uso pretendidos para o seu aplicativo.
Mas, para aproveitar uma API REST, é preciso reimaginar o domínio de negócios cuidadosamente projetado em termos de operações CRUD em entidades. O que poderia ser uma única ação atômica no seu aplicativo - por exemplo, criar uma nova conta - pode, na verdade, exigir uma série de várias solicitações à API REST.
Dessa forma, para aproveitar o REST, você precisa envolver seu modelo para adaptá-lo à API e, nesse processo, tende a perder a riqueza e a expressividade do seu modelo.
Lidar com uma Internet inerentemente não confiável
A primeira falácia da lista de Falácias da computação distribuída é A rede é confiável. L Peter Deutsch e seus colegas da Sun, autores da lista, disseram o seguinte sobre aplicativos que dependem excessivamente de uma conexão de rede sólida:
"Os aplicativos de software são escritos com pouco tratamento de erros de rede. Durante uma interrupção da rede, esses aplicativos podem ficar parados ou esperar infinitamente por um pacote de resposta, consumindo permanentemente memória ou outros recursos. Quando a rede com falha se torna disponível, esses aplicativos também podem deixar de tentar novamente qualquer operação paralisada ou exigir uma reinicialização (manual)."
Se você usa aplicativos móveis regularmente e também muda de local com frequência, como quando está no trabalho ou viajando, sem dúvida já experimentou a frustração das zonas mortas da Internet que afetam esses aplicativos.
Como desenvolvedor, a forma como você lida com a disponibilidade da rede tem implicações enormes na experiência do usuário do aplicativo. Há muitos pontos potenciais de falha introduzidos por problemas de rede e inúmeras maneiras de tentar resolvê-los, mas o resultado final é que você mesmo precisa implementar a lógica de comunicação e o tratamento de erros, o que pode tornar extremamente complexas até mesmo as tarefas mais simples.
Considere este fluxograma para solicitar uma lista de produtos de um ponto de extremidade REST:
No design inicial do aplicativo, a ação parece fácil de ser realizada com o REST: emitir a solicitação, receber a resposta, atualizar a interface do usuário.
Mas a realidade é que, para cada solicitação, há um punhado de estados possíveis que precisam ser considerados e tratados, todos começando com a disponibilidade da rede. Embora o número de pontos de decisão possa parecer gerenciável à primeira vista, observe quantos caminhos levam à falha, e isso apenas para uma única solicitação.
Agora, considere que muitas ações em seu aplicativo exigirão que várias solicitações dependentes sejam emitidas em rápida sucessão, cada uma precisando atravessar os pontos de decisão no fluxograma. Agora, multiplique esse processo pelo número de solicitações que seu aplicativo normalmente faz, e fica fácil ver como isso aumenta exponencialmente a probabilidade de uma falha.
Nesse cenário, como você se recupera se a última de uma série de solicitações dependentes falhar? Você tenta novamente a solicitação até que ela seja bem-sucedida? Você reverte as solicitações anteriores da série? Você ignora a falha por completo? Esses são os tipos de desafios de desenvolvimento que as dependências de rede podem apresentar.
Os desafios do REST são insuperáveis? Bem, não, mas......
Os desenvolvedores talentosos sempre podem encontrar soluções alternativas para problemas e desafios. Mas isso leva tempo e aumenta a complexidade do código do aplicativo, além de provavelmente acrescentar mais consumo de recursos à pegada operacional do aplicativo, tornando-o mais lento e consumindo mais bateria do dispositivo. A verdadeira questão não é "como contornar o problema?", mas sim "a que custo?".
Os microsserviços podem ajudar a automatizar tarefas repetitivas ao usar REST, e os autores de APIs estão usando meios cada vez mais criativos para fornecer pontos de extremidade com OBTER e parâmetros personalizados POST cargas úteis JSON, bem como pontos de extremidade que manipulam solicitações em massa.
Esses tipos de abordagens resolvem algumas das dores de cabeça ao usar REST, mas o pontos de dor discutidos nesta postagem permanecem constantes:
-
- Falta de validação de esquema e tipo de dados
- Transformação de dados de ida e volta
- Traduzindo a lógica do domínio comercial para um modelo de transporte simples
- Lidando com uma Internet inerentemente não confiável
A plataforma de banco de dados Couchbase Mobile
O Couchbase Mobile resolve os pontos problemáticos da API REST, eliminando totalmente a necessidade de usar REST para dados. É uma solução abrangente de armazenamento e sincronização de dados para aplicativos móveis e de IoT que inclui um banco de dados em nuvem para dimensionamento e resiliência, um banco de dados incorporado para processamento de dados no dispositivo que elimina as dependências de uma rede para acesso aos dados e um gateway de sincronização de dados que sincroniza automaticamente as alterações de dados entre o banco de dados de back-end e outros clientes de aplicativos para garantir a consistência dos dados.
A pilha do Couchbase Mobile inclui:
Couchbase Capella - Um banco de dados NoSQL como serviço (DBaaS) totalmente gerenciado na nuvem com suporte a SQL, pesquisa, análise e eventos.
Serviços de aplicativos Capella - Serviço totalmente gerenciado para sincronização bidirecional, autenticação e controle de acesso para aplicativos móveis e de borda.
Couchbase Lite - Um banco de dados NoSQL móvel incorporado com suporte a SQL, sincronização ponto a ponto integrada e amplo suporte a plataformas móveis, incluindo iOS (Swift, Obj-C), Android (Java, Kotlin), Windows (C#, .NET) e dispositivos incorporados personalizados/IoT (C-API).
O Capella App Services atua como o ingrediente de ligação na pilha, fornecendo sincronização de dados baseada em websockets entre o banco de dados Capella de back-end, os data centers de borda e os aplicativos incorporados do Couchbase Lite em dispositivos de borda. O uso de os websockets oferecem, sem dúvida, um meio de transporte de dados superior ao REST para aplicativos móveis com cargas pesadas de dados de alto volume. Com os App Services, as alterações de dados são replicadas instantânea e automaticamente em todo o ecossistema de aplicativos, conforme a conectividade permite, e, durante interrupções na rede, os aplicativos continuam a operar graças ao banco de dados Couchbase Lite incorporado.
Sincronização ponto a ponto do Couchbase Lite
Além de sincronizar dados entre a nuvem e a borda por meio dos App Services, o Couchbase Lite também pode sincronizar dados ponto a ponto em redes locais e pessoais.
O recurso de sincronização Peer-to-Peer do Couchbase Lite permite que os dados sejam sincronizados diretamente entre dispositivos sem um ponto de controle central, possibilitando a colaboração isolada, em que grupos de dispositivos que executam aplicativos incorporados do Couchbase Lite podem compartilhar dados entre si, independentemente do acesso à nuvem ou da conectividade com a Internet. Quando a conectividade com a Internet se torna disponível, os clientes do Couchbase Lite podem sincronizar com a nuvem, aproveitando os App Services.
A vantagem do Couchbase
Usando o Couchbase, você compartilha as mesmas entidades de dados do banco de dados em nuvem com os aplicativos executados em dispositivos móveis e aproveita uma maneira padrão simples de executar operações CRUD nesses dados: SQL. Como o processamento de dados é incorporado ao seu código, você não precisa mais depender de redes para acesso e elimina a necessidade de transformar os dados entre a camada de transporte, a camada de dados e a interface do usuário.
Com o Couchbase, você obtém:
Funcionalidade off-line em primeiro lugar - Os aplicativos funcionam o tempo todo graças ao banco de dados local incorporado, e as alterações são sincronizadas automaticamente com o banco de dados na nuvem e com outros clientes de aplicativos quando há conectividade de rede.
Desenvolvimento mais fácil - Construa sua lógica de negócios e trabalhe com entidades de dados usando a linguagem de programação de sua preferência. Não há mais limitação de seus domínios de negócios para satisfazer os requisitos de uma camada de comunicação e não há mais transformações de dados intermináveis.
Segurança sólida como uma rocha - O Couchbase Mobile fornece autenticação, controle de acesso baseado em função, criptografia AES 256 em repouso e criptografia TLS 1.2 na rede.
Sincronização de dados de ponta a ponta - Não perca tempo criando um recurso de cache; em vez disso, use uma solução de sincronização de dados pronta para uso e libere a sua equipe para trabalhar em tornar o front-end do aplicativo o melhor possível. O Couchbase usa websockets, que é muito mais confiável e resiliente do que o REST, para sincronizar dados instantaneamente entre a nuvem e os dispositivos móveis, mesmo entre plataformas.
Experimente o Couchbase Mobile gratuitamente
Com o Couchbase Mobile, você pode remover os pontos problemáticos do REST da equação, simplificando o desenvolvimento de aplicativos móveis, reduzindo as dependências de conectividade de rede e melhorando a velocidade geral, a eficiência e a capacidade de resposta do seu aplicativo.
Não perca mais um minuto de sono usando REST para criar seus aplicativos móveis. Comece a usar o Couchbase para obter desenvolvimento mais fácil, melhor desempenho, capacidade de resposta mais rápida e funcionalidade off-line em primeiro lugar.