SlideShare uma empresa Scribd logo
1 de 5
Baixar para ler offline
RESTful considerada
prejudicial – Parte 1
APIs RESTful são comuns em toda a internet, mas isso é
uma coisa boa?
Eu não gosto de princípios e APIs RESTful. Nos últimos anos, ele
é visto como o protocolo universal para comunicação entre
processos, especialmente em sistemas distribuídos. No entanto
eu vejo muitas deficiências de REST e existem alternativas que
funcionam bem para certos casos de uso. Obviamente, não
existe um tamanho único, eu só quero enfatizar que a arquitetura
REST é falho em um número de maneiras.
Inchado, um formato legível que Exige
compressão extra
O formato padrão de facto para REST é JSON. Pelo menos é
muito melhor do que o sabão com o seu XML e envelopes. Quer
muita largura de banda de rede é perdido (pode ser um problema
com dispositivos móveis ou grandes centros de dados) ou CPU é
gasto na compressão e descompressão. Uma bela citação:
[A] internet está sendo executado em fonte modo de depuração
É um problema sério, pergunte operadores de alta frequência
como duramente parsing FIX baseado em texto é. Há uma
abundância de bem estabelecido protocolos binários que são
ambos fácil de analisar e utilizar pouca memória, por exemplo,
buffers de protocolo, Avro ou poupança. Além disso
compatibilidade com versões anteriores é construído para eles.
Pode ser tecnicamente usando o Google Protocol Buffers com
serviços REST baseados em MVC Spring - mas de alguma forma
muito poucos fazê-lo desta forma e ficar com JSON.
Claro JSON tem uma (literalmente, um) enorme vantagem - é
legível. Bem, pelo menos enquanto é bastante impressa -
raramente o caso. Mas será que realmente querem pagar esse
preço, em vez de apenas usar o formato binário por padrão e tem
tradutor ou mudar quando a intervenção humana é necessária?
Nem esquema Nem Contrato
Eu pertenço ao campo de tipagem estática. Eu adoro quando
meu compilador encontra erros antes mesmo de eu executar
testes de unidade - e que eu não preciso escrever tantos deles
em primeiro lugar. Além disso, especialmente na programação
funcional se o código compila, é possível que ele funciona porque
o contrato imposta pelos tipos é tão rigorosa. Ao lidar com XML
Estou feliz por ter XSD validados para que eu possa ter certeza
de que eu li conforma com o contrato. Posso reduzir o número de
afirmações e manter o código mais curto. Além disso, o XML eu
produzo é garantido para ser sintaticamente correto. Por último,
mas não menos importante quando se trabalha com bancos de
dados relacionais do esquema rigoroso me impede de corrupção
de dados através da inserção de valores incorretos. À
semelhança do XML, eu também posso confiar no que eu li:
chaves estrangeiras estão corretas, colunas NOT NULL
realmente não são null, etc Estas são claramente as vantagens
do contrato de máquina aplicada. De alguma forma, tudo isso não
é importante mais ao projetar API a ser produzida e consumida
pelas máquinas em um sistema distribuído (e, acidentalmente,
em muitos bancos de dados NoSQL sem esquema como
MongoDB).
ódio compreensível do SOAP nos empurrou para outro extremo -
sem contrato em tudo. Não há um padrão generalizado para
documentar contratos e aplicá-las automaticamente para APIs
REST. A maioria das APIs I encontrar estes dias são apenas uma
coleção de solicitações de amostras e respostas, Swagger na
melhor das hipóteses. Eu nunca sei quais os campos são
opcionais, quais são os formatos e restrições. Alguém poderia
argumentar que isso é por design, que não fazer par-nos a um
API de concreto, permitindo que ela evolua. Mas tenho a
sensação de que a maioria dos consumidores de API são, no
entanto, acoplado e vai quebrar uma vez em situação irregular e
alteração sem aviso prévio é desenrolado.
Publishing URIs
Falando sobre a documentação, os puristas afirmam que a única
peça de API informações devem expor é a raiz URI, por exemplo,
www.example.com/api.Tudo o resto, incluindo métodos, recursos, tipos e
documentos de conteúdo permitida devem ser descoberto
através HATEOAS. E se URIs não são oficialmente documentado
mas em vez disso deve ser descoberto, isso implica que não
deve confiar em URIs codificados em nosso código, mas sim
percorrer a árvore de recursos cada vez que utilizar essa API.
Este é idiomática, no entanto, também lento e sujeito a erros.
Sem mencionar Swagger, o padrão de fato para a documentação
REST, afirma oficialmente tal abordagem "não é por o projeto" - e
paus para URIs fixo.
Não há suporte para dosagem, Pager,
Classificação / Searching, ...]
serviço web RESTful não suporta nativamente muitos recursos de
nível empresarial de APIs como pedidos de lotes, paginação,
classificação, pesquisa e muitos outros. Há sugestões de
concorrentes, como parâmetros de consulta, cabeçalhos de
solicitação, etc. Lembro-me de uma longa discussão sobre horas
flexíveis de busca API tivemos há algum tempo. Deve haver:
 single SQL-like parameter (with proper escaping!),
e.g. query=age>10 and (name=John or company=Foo)
 multiple parameters for each criteria,
e.g. age=10&name=John&company=Foo (but how to
implement OR operator?)
 most bizarre: stateful POST on /searches with criteria modeled
with JSON-like structure, returning URL to search results
(/searches/25), which can later be queried
REST está realmente constrangedora aqui.
CRUD por Definição
serviços Web RESTful são CRUD-orientado, em vez de
Business- ou orientada a transação. Inúmeras vezes tivemos
para mapear cuidadosamente os termos do negócio em simples
criar / update / delete ações. Mundo não é assim tão simples e
nem tudo pode ser simplesmente descrito em criar ou frases de
atualização. E mesmo se ele pode, muitas vezes endpoints
RESTful são terrivelmente estranho e artificial. Você ainda se
lembra POST para /searches ?
Além disso nem todos os dados podem ser mapeados em
estrutura de árvore URI e muitas vezes nós permitimos
desnormalização, por exemplo, o mesmo recurso está disponível
sob várias URIs de modo que seja facilmente acessível.
Imagine um sistema que publica eventos de domínio, alterações
de estado arbitrários, por exemplo:
LoanApproved, EmailSent, etc. É claro que cada evento tem seu próprio
conjunto, distinta de atributos. Como você projeta uma API
RESTful que consome tais eventos? Inevitavelmente você vai
acabar com POST /domainEvents que aceita JSON arbitrária, talvez
com algum tag como "type": "LoanApproved". Então você tem um ponto
de extremidade que leva arbitrária "BLOB" JSON e,
provavelmente, tem uma declaração gigante switch-como
interpretar vários tipos de eventos corretamente. Substituir "type"
com"method" e você só reinventou JSON RPC. Como você fazer
isso de uma forma idiomática? Traduzir cada evento de domínio
no lado do editor de chamada de API apropriada? Não soa muito
robusto.
Verbos HTTP não são suficientemente
descritivo
Mapeamento de termos de negócios em
POST/PUT/PATCH/DELETE/HEAD é tedioso e infantil. Assim
como com URIs, mundo é muito mais rica e nem tudo se encaixa
esses baldes. Esses verbos foram projetados para interagir com
documentos e formulários em World Wide Web. Usando REST
parece degradar o nosso domínio do negócio de volta para o
navegador de banco de dados. Não há lógica, não Domain-
Driven Design, há fluxos ricos. Nós simplesmente manipular
objetos, transferi-los para trás e para frente. Claro RESTO não
precisa e não deve mapear diretamente para entidades de banco
de dados. Mas mesmo se eles são mapeados para o seu domínio
de negócio core, você ainda tem que ver o seu domínio através
de interface CRUD limitado.

Mais conteúdo relacionado

Destaque

IEEE Grant Opportunities for Young Scientists and Students
IEEE Grant Opportunities for Young Scientists and StudentsIEEE Grant Opportunities for Young Scientists and Students
IEEE Grant Opportunities for Young Scientists and StudentsYSF-2015
 
Smuggle Ideas To Real World
Smuggle Ideas To Real WorldSmuggle Ideas To Real World
Smuggle Ideas To Real WorldYSF-2015
 
Shipping your logs to elk from mule app/cloudhub part 1
Shipping  your logs to elk from mule app/cloudhub   part 1Shipping  your logs to elk from mule app/cloudhub   part 1
Shipping your logs to elk from mule app/cloudhub part 1Alex Fernandez
 
Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2Jeison Barros
 
Mulesoft salesforce connector to update Object.
Mulesoft salesforce connector to update Object.Mulesoft salesforce connector to update Object.
Mulesoft salesforce connector to update Object.Yogesh Chandr
 
Sessió 2. tema i títol
Sessió 2. tema i títolSessió 2. tema i títol
Sessió 2. tema i títolsesgurb
 
Mule concepts
Mule conceptsMule concepts
Mule conceptsSindhu VL
 
Xslt attributes
Xslt attributesXslt attributes
Xslt attributesSindhu VL
 
φαγητα της ρωσιας
φαγητα της ρωσιαςφαγητα της ρωσιας
φαγητα της ρωσιαςChrysa Arabatzoglou
 

Destaque (15)

Mule
MuleMule
Mule
 
IEEE Grant Opportunities for Young Scientists and Students
IEEE Grant Opportunities for Young Scientists and StudentsIEEE Grant Opportunities for Young Scientists and Students
IEEE Grant Opportunities for Young Scientists and Students
 
Smuggle Ideas To Real World
Smuggle Ideas To Real WorldSmuggle Ideas To Real World
Smuggle Ideas To Real World
 
My disabled film
My disabled filmMy disabled film
My disabled film
 
Shipping your logs to elk from mule app/cloudhub part 1
Shipping  your logs to elk from mule app/cloudhub   part 1Shipping  your logs to elk from mule app/cloudhub   part 1
Shipping your logs to elk from mule app/cloudhub part 1
 
Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2
 
Mulesoft salesforce connector to update Object.
Mulesoft salesforce connector to update Object.Mulesoft salesforce connector to update Object.
Mulesoft salesforce connector to update Object.
 
Novedades en el tratamiento no farmacológico
Novedades en el tratamiento no farmacológicoNovedades en el tratamiento no farmacológico
Novedades en el tratamiento no farmacológico
 
Sessió 2. tema i títol
Sessió 2. tema i títolSessió 2. tema i títol
Sessió 2. tema i títol
 
Αβορίγινες
ΑβορίγινεςΑβορίγινες
Αβορίγινες
 
ινδια
ινδιαινδια
ινδια
 
Mule concepts
Mule conceptsMule concepts
Mule concepts
 
Xslt attributes
Xslt attributesXslt attributes
Xslt attributes
 
φαγητα της ρωσιας
φαγητα της ρωσιαςφαγητα της ρωσιας
φαγητα της ρωσιας
 
Transform Message
Transform MessageTransform Message
Transform Message
 

Semelhante a RESTful APIs: Limitações e Alternativas

Restful considerada prejudicial parte 2
Restful considerada prejudicial   parte 2Restful considerada prejudicial   parte 2
Restful considerada prejudicial parte 2Jeison Barros
 
Workshop do Bem: O mundo das APIs
Workshop do Bem: O mundo das APIsWorkshop do Bem: O mundo das APIs
Workshop do Bem: O mundo das APIsHeider Lopes
 
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMAS
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMASO MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMAS
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMASHeider Lopes
 
O básico do uso de rest vs soap
O básico do uso de rest vs soapO básico do uso de rest vs soap
O básico do uso de rest vs soapJeison Barros
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONMario Guedes
 
Hangout Tempo Real Eventos - Nodejs - Os Primeiros Passos
Hangout  Tempo Real Eventos - Nodejs - Os Primeiros PassosHangout  Tempo Real Eventos - Nodejs - Os Primeiros Passos
Hangout Tempo Real Eventos - Nodejs - Os Primeiros PassosJackson F. de A. Mafra
 
Soa – Woa Rest Arquiteturas
Soa – Woa   Rest ArquiteturasSoa – Woa   Rest Arquiteturas
Soa – Woa Rest Arquiteturasrafaslide
 
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...Vinicius Pulgatti
 
Congresso iv
Congresso ivCongresso iv
Congresso ivIP10
 
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...Danilo Sato
 
Introdução ao Desenvolvimento front-end (2019)
Introdução ao Desenvolvimento front-end (2019)Introdução ao Desenvolvimento front-end (2019)
Introdução ao Desenvolvimento front-end (2019)Gustavo Teodoro
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixAndré Déo
 
Apresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo SitesApresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo Sitesthiagolima
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]Igor Santos
 

Semelhante a RESTful APIs: Limitações e Alternativas (20)

Restful considerada prejudicial parte 2
Restful considerada prejudicial   parte 2Restful considerada prejudicial   parte 2
Restful considerada prejudicial parte 2
 
Workshop do Bem: O mundo das APIs
Workshop do Bem: O mundo das APIsWorkshop do Bem: O mundo das APIs
Workshop do Bem: O mundo das APIs
 
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMAS
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMASO MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMAS
O MUNDO DAS APIS OTIMIZANDO A INTEGRAÇÃO DE SISTEMAS
 
O básico do uso de rest vs soap
O básico do uso de rest vs soapO básico do uso de rest vs soap
O básico do uso de rest vs soap
 
Palestra Sobre REST
Palestra Sobre RESTPalestra Sobre REST
Palestra Sobre REST
 
Trabalho Final PSDC - Simião
Trabalho Final PSDC - SimiãoTrabalho Final PSDC - Simião
Trabalho Final PSDC - Simião
 
Trabalho final psdc
Trabalho final psdcTrabalho final psdc
Trabalho final psdc
 
Trabalho fin
Trabalho finTrabalho fin
Trabalho fin
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSON
 
Hangout Tempo Real Eventos - Nodejs - Os Primeiros Passos
Hangout  Tempo Real Eventos - Nodejs - Os Primeiros PassosHangout  Tempo Real Eventos - Nodejs - Os Primeiros Passos
Hangout Tempo Real Eventos - Nodejs - Os Primeiros Passos
 
REST and JEE
REST and JEEREST and JEE
REST and JEE
 
Soa – Woa Rest Arquiteturas
Soa – Woa   Rest ArquiteturasSoa – Woa   Rest Arquiteturas
Soa – Woa Rest Arquiteturas
 
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
Apresentacao Boas praticas, revisão java, SOLID, KISS, DRY, design patterns, ...
 
Escalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLIDEscalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLID
 
Congresso iv
Congresso ivCongresso iv
Congresso iv
 
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
Direto das Trincheiras: Boas e más práticas de aplicações Ruby em ambientes c...
 
Introdução ao Desenvolvimento front-end (2019)
Introdução ao Desenvolvimento front-end (2019)Introdução ao Desenvolvimento front-end (2019)
Introdução ao Desenvolvimento front-end (2019)
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com Zabbix
 
Apresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo SitesApresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo Sites
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
 

Mais de Jeison Barros

Introdução a RAML - parte 1
Introdução a RAML -  parte 1Introdução a RAML -  parte 1
Introdução a RAML - parte 1Jeison Barros
 
Estratégia api e design
Estratégia api e designEstratégia api e design
Estratégia api e designJeison Barros
 
Transformando eficientemente resultados de uma consulta jdbc para json
Transformando eficientemente resultados de uma consulta jdbc para jsonTransformando eficientemente resultados de uma consulta jdbc para json
Transformando eficientemente resultados de uma consulta jdbc para jsonJeison Barros
 
Como criar um http proxy dinamico com mule parte 3
Como criar um http proxy dinamico com mule   parte 3Como criar um http proxy dinamico com mule   parte 3
Como criar um http proxy dinamico com mule parte 3Jeison Barros
 
Como criar um http proxy dinamico com mule parte 1
Como criar um http proxy dinamico com mule   parte 1Como criar um http proxy dinamico com mule   parte 1
Como criar um http proxy dinamico com mule parte 1Jeison Barros
 
Conectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcConectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcJeison Barros
 
Habilidades necessárias para integrar aplicativos e dados
Habilidades necessárias para integrar aplicativos e dadosHabilidades necessárias para integrar aplicativos e dados
Habilidades necessárias para integrar aplicativos e dadosJeison Barros
 
Qual integration framework você deve usar parte 2
Qual integration framework você deve usar parte 2Qual integration framework você deve usar parte 2
Qual integration framework você deve usar parte 2Jeison Barros
 
Qual integration framework você deve usar parte 1
Qual integration framework você deve usar parte 1Qual integration framework você deve usar parte 1
Qual integration framework você deve usar parte 1Jeison Barros
 
Consumindo soap wsdl
Consumindo soap wsdlConsumindo soap wsdl
Consumindo soap wsdlJeison Barros
 
Trabalhando com anexos soap usando módulo cxf do mule
Trabalhando com anexos soap usando módulo cxf do muleTrabalhando com anexos soap usando módulo cxf do mule
Trabalhando com anexos soap usando módulo cxf do muleJeison Barros
 
Começando com mulesoft e maven
Começando com mulesoft e mavenComeçando com mulesoft e maven
Começando com mulesoft e mavenJeison Barros
 
Estudo de caso: Mule como um transporte JMS Comum
Estudo de caso: Mule como um transporte JMS ComumEstudo de caso: Mule como um transporte JMS Comum
Estudo de caso: Mule como um transporte JMS ComumJeison Barros
 
Mule esb com framework cucumber part 1
Mule esb com framework cucumber part 1Mule esb com framework cucumber part 1
Mule esb com framework cucumber part 1Jeison Barros
 
Mule esb com framework cucumber part 2
Mule esb com framework cucumber part 2Mule esb com framework cucumber part 2
Mule esb com framework cucumber part 2Jeison Barros
 
Explorando mule esb sftp adapter
Explorando mule esb sftp adapterExplorando mule esb sftp adapter
Explorando mule esb sftp adapterJeison Barros
 
Fluxo dinâmicos usando spring aplication
Fluxo dinâmicos usando spring aplicationFluxo dinâmicos usando spring aplication
Fluxo dinâmicos usando spring aplicationJeison Barros
 
Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Jeison Barros
 

Mais de Jeison Barros (20)

Pdfteste
PdftestePdfteste
Pdfteste
 
Introdução a RAML - parte 1
Introdução a RAML -  parte 1Introdução a RAML -  parte 1
Introdução a RAML - parte 1
 
Estratégia api e design
Estratégia api e designEstratégia api e design
Estratégia api e design
 
Transformando eficientemente resultados de uma consulta jdbc para json
Transformando eficientemente resultados de uma consulta jdbc para jsonTransformando eficientemente resultados de uma consulta jdbc para json
Transformando eficientemente resultados de uma consulta jdbc para json
 
Como criar um http proxy dinamico com mule parte 3
Como criar um http proxy dinamico com mule   parte 3Como criar um http proxy dinamico com mule   parte 3
Como criar um http proxy dinamico com mule parte 3
 
Como criar um http proxy dinamico com mule parte 1
Como criar um http proxy dinamico com mule   parte 1Como criar um http proxy dinamico com mule   parte 1
Como criar um http proxy dinamico com mule parte 1
 
Rest api vs SOAP
Rest api vs SOAPRest api vs SOAP
Rest api vs SOAP
 
Conectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcConectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbc
 
Habilidades necessárias para integrar aplicativos e dados
Habilidades necessárias para integrar aplicativos e dadosHabilidades necessárias para integrar aplicativos e dados
Habilidades necessárias para integrar aplicativos e dados
 
Qual integration framework você deve usar parte 2
Qual integration framework você deve usar parte 2Qual integration framework você deve usar parte 2
Qual integration framework você deve usar parte 2
 
Qual integration framework você deve usar parte 1
Qual integration framework você deve usar parte 1Qual integration framework você deve usar parte 1
Qual integration framework você deve usar parte 1
 
Consumindo soap wsdl
Consumindo soap wsdlConsumindo soap wsdl
Consumindo soap wsdl
 
Trabalhando com anexos soap usando módulo cxf do mule
Trabalhando com anexos soap usando módulo cxf do muleTrabalhando com anexos soap usando módulo cxf do mule
Trabalhando com anexos soap usando módulo cxf do mule
 
Começando com mulesoft e maven
Começando com mulesoft e mavenComeçando com mulesoft e maven
Começando com mulesoft e maven
 
Estudo de caso: Mule como um transporte JMS Comum
Estudo de caso: Mule como um transporte JMS ComumEstudo de caso: Mule como um transporte JMS Comum
Estudo de caso: Mule como um transporte JMS Comum
 
Mule esb com framework cucumber part 1
Mule esb com framework cucumber part 1Mule esb com framework cucumber part 1
Mule esb com framework cucumber part 1
 
Mule esb com framework cucumber part 2
Mule esb com framework cucumber part 2Mule esb com framework cucumber part 2
Mule esb com framework cucumber part 2
 
Explorando mule esb sftp adapter
Explorando mule esb sftp adapterExplorando mule esb sftp adapter
Explorando mule esb sftp adapter
 
Fluxo dinâmicos usando spring aplication
Fluxo dinâmicos usando spring aplicationFluxo dinâmicos usando spring aplication
Fluxo dinâmicos usando spring aplication
 
Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2
 

RESTful APIs: Limitações e Alternativas

  • 1. RESTful considerada prejudicial – Parte 1 APIs RESTful são comuns em toda a internet, mas isso é uma coisa boa? Eu não gosto de princípios e APIs RESTful. Nos últimos anos, ele é visto como o protocolo universal para comunicação entre processos, especialmente em sistemas distribuídos. No entanto eu vejo muitas deficiências de REST e existem alternativas que funcionam bem para certos casos de uso. Obviamente, não existe um tamanho único, eu só quero enfatizar que a arquitetura REST é falho em um número de maneiras. Inchado, um formato legível que Exige compressão extra O formato padrão de facto para REST é JSON. Pelo menos é muito melhor do que o sabão com o seu XML e envelopes. Quer muita largura de banda de rede é perdido (pode ser um problema com dispositivos móveis ou grandes centros de dados) ou CPU é gasto na compressão e descompressão. Uma bela citação: [A] internet está sendo executado em fonte modo de depuração É um problema sério, pergunte operadores de alta frequência como duramente parsing FIX baseado em texto é. Há uma abundância de bem estabelecido protocolos binários que são ambos fácil de analisar e utilizar pouca memória, por exemplo, buffers de protocolo, Avro ou poupança. Além disso compatibilidade com versões anteriores é construído para eles. Pode ser tecnicamente usando o Google Protocol Buffers com serviços REST baseados em MVC Spring - mas de alguma forma muito poucos fazê-lo desta forma e ficar com JSON. Claro JSON tem uma (literalmente, um) enorme vantagem - é legível. Bem, pelo menos enquanto é bastante impressa - raramente o caso. Mas será que realmente querem pagar esse
  • 2. preço, em vez de apenas usar o formato binário por padrão e tem tradutor ou mudar quando a intervenção humana é necessária? Nem esquema Nem Contrato Eu pertenço ao campo de tipagem estática. Eu adoro quando meu compilador encontra erros antes mesmo de eu executar testes de unidade - e que eu não preciso escrever tantos deles em primeiro lugar. Além disso, especialmente na programação funcional se o código compila, é possível que ele funciona porque o contrato imposta pelos tipos é tão rigorosa. Ao lidar com XML Estou feliz por ter XSD validados para que eu possa ter certeza de que eu li conforma com o contrato. Posso reduzir o número de afirmações e manter o código mais curto. Além disso, o XML eu produzo é garantido para ser sintaticamente correto. Por último, mas não menos importante quando se trabalha com bancos de dados relacionais do esquema rigoroso me impede de corrupção de dados através da inserção de valores incorretos. À semelhança do XML, eu também posso confiar no que eu li: chaves estrangeiras estão corretas, colunas NOT NULL realmente não são null, etc Estas são claramente as vantagens do contrato de máquina aplicada. De alguma forma, tudo isso não é importante mais ao projetar API a ser produzida e consumida pelas máquinas em um sistema distribuído (e, acidentalmente, em muitos bancos de dados NoSQL sem esquema como MongoDB). ódio compreensível do SOAP nos empurrou para outro extremo - sem contrato em tudo. Não há um padrão generalizado para documentar contratos e aplicá-las automaticamente para APIs REST. A maioria das APIs I encontrar estes dias são apenas uma coleção de solicitações de amostras e respostas, Swagger na melhor das hipóteses. Eu nunca sei quais os campos são opcionais, quais são os formatos e restrições. Alguém poderia argumentar que isso é por design, que não fazer par-nos a um API de concreto, permitindo que ela evolua. Mas tenho a sensação de que a maioria dos consumidores de API são, no entanto, acoplado e vai quebrar uma vez em situação irregular e alteração sem aviso prévio é desenrolado. Publishing URIs
  • 3. Falando sobre a documentação, os puristas afirmam que a única peça de API informações devem expor é a raiz URI, por exemplo, www.example.com/api.Tudo o resto, incluindo métodos, recursos, tipos e documentos de conteúdo permitida devem ser descoberto através HATEOAS. E se URIs não são oficialmente documentado mas em vez disso deve ser descoberto, isso implica que não deve confiar em URIs codificados em nosso código, mas sim percorrer a árvore de recursos cada vez que utilizar essa API. Este é idiomática, no entanto, também lento e sujeito a erros. Sem mencionar Swagger, o padrão de fato para a documentação REST, afirma oficialmente tal abordagem "não é por o projeto" - e paus para URIs fixo. Não há suporte para dosagem, Pager, Classificação / Searching, ...] serviço web RESTful não suporta nativamente muitos recursos de nível empresarial de APIs como pedidos de lotes, paginação, classificação, pesquisa e muitos outros. Há sugestões de concorrentes, como parâmetros de consulta, cabeçalhos de solicitação, etc. Lembro-me de uma longa discussão sobre horas flexíveis de busca API tivemos há algum tempo. Deve haver:  single SQL-like parameter (with proper escaping!), e.g. query=age>10 and (name=John or company=Foo)  multiple parameters for each criteria, e.g. age=10&name=John&company=Foo (but how to implement OR operator?)  most bizarre: stateful POST on /searches with criteria modeled with JSON-like structure, returning URL to search results (/searches/25), which can later be queried REST está realmente constrangedora aqui. CRUD por Definição serviços Web RESTful são CRUD-orientado, em vez de Business- ou orientada a transação. Inúmeras vezes tivemos para mapear cuidadosamente os termos do negócio em simples
  • 4. criar / update / delete ações. Mundo não é assim tão simples e nem tudo pode ser simplesmente descrito em criar ou frases de atualização. E mesmo se ele pode, muitas vezes endpoints RESTful são terrivelmente estranho e artificial. Você ainda se lembra POST para /searches ? Além disso nem todos os dados podem ser mapeados em estrutura de árvore URI e muitas vezes nós permitimos desnormalização, por exemplo, o mesmo recurso está disponível sob várias URIs de modo que seja facilmente acessível. Imagine um sistema que publica eventos de domínio, alterações de estado arbitrários, por exemplo: LoanApproved, EmailSent, etc. É claro que cada evento tem seu próprio conjunto, distinta de atributos. Como você projeta uma API RESTful que consome tais eventos? Inevitavelmente você vai acabar com POST /domainEvents que aceita JSON arbitrária, talvez com algum tag como "type": "LoanApproved". Então você tem um ponto de extremidade que leva arbitrária "BLOB" JSON e, provavelmente, tem uma declaração gigante switch-como interpretar vários tipos de eventos corretamente. Substituir "type" com"method" e você só reinventou JSON RPC. Como você fazer isso de uma forma idiomática? Traduzir cada evento de domínio no lado do editor de chamada de API apropriada? Não soa muito robusto. Verbos HTTP não são suficientemente descritivo Mapeamento de termos de negócios em POST/PUT/PATCH/DELETE/HEAD é tedioso e infantil. Assim como com URIs, mundo é muito mais rica e nem tudo se encaixa esses baldes. Esses verbos foram projetados para interagir com documentos e formulários em World Wide Web. Usando REST parece degradar o nosso domínio do negócio de volta para o navegador de banco de dados. Não há lógica, não Domain- Driven Design, há fluxos ricos. Nós simplesmente manipular objetos, transferi-los para trás e para frente. Claro RESTO não precisa e não deve mapear diretamente para entidades de banco de dados. Mas mesmo se eles são mapeados para o seu domínio
  • 5. de negócio core, você ainda tem que ver o seu domínio através de interface CRUD limitado.