Um canário em uma mina de carvão.
Estou esperando por uma pergunta como essa há quase um ano. Era inevitável que esse dia chegasse e tenho certeza de que vamos ver muitas outras perguntas como essa nos próximos meses.
Os sinais de alerta
Você está absolutamente correto, leva mais tempo para construir clientes RESTful do que clientes SOAP. Os kits de ferramentas SOAP retiram muito código padrão e disponibilizam objetos de proxy do cliente sem quase nenhum esforço. Com uma ferramenta como o Visual Studio e uma URL de servidor, posso acessar objetos remotos de complexidade arbitrária, localmente em menos de cinco minutos.
Os serviços que retornam application / xml e application / json são muito irritantes para os desenvolvedores de clientes. O que devemos fazer com esse blob de dados?
Felizmente, muitos sites que fornecem serviços REST também fornecem várias bibliotecas clientes, para que possamos usá-las para obter acesso a vários objetos fortemente tipados. Parece meio idiota. Se eles tivessem usado o SOAP, poderíamos ter codificado essas classes de proxy.
Sobrecarga de sabão, ha. É a latência que mata. Se as pessoas estão realmente preocupadas com o número de bytes em excesso que atravessam a conexão, talvez o HTTP não seja a escolha certa. Você viu quantos bytes são usados pelo cabeçalho do agente do usuário?
Sim, você já tentou usar um navegador da Web como ferramenta de depuração para algo diferente de HTML e javascript. Confie em mim, é uma merda. Você pode usar apenas dois dos verbos, o cache está constantemente atrapalhando, o tratamento de erros engole tanta informação, está constantemente procurando um maldito favicon.ico. Apenas atire em mim.
URL legível. Apenas substantivos, sem verbos. Sim, isso é fácil, desde que façamos apenas operações CRUD e só precisamos acessar uma hierarquia de objetos de uma maneira. Infelizmente, a maioria dos aplicativos precisa de um pouquinho mais de funcionalidade do que isso.
O desastre iminente
Atualmente, há um grande número de métricas de desenvolvedores que desenvolvem aplicativos que se integram aos serviços REST que estão no processo de chegar ao mesmo conjunto de conclusões que você possui. Eles prometeram simplicidade, flexibilidade, escalabilidade, evolução e o santo graal da reutilização acidental. As características da web em si, como as coisas podem dar errado.
No entanto, eles estão descobrindo que o controle de versão é um problema, mas o compilador não ajuda a detectar problemas. O código do cliente escrito à mão é uma tarefa difícil de manter à medida que as estruturas de dados evoluem e os URLs são refatorados. Projetar APIs em torno de apenas substantivos e quatro verbos pode ser muito difícil, especialmente com os fanáticos do URL RESTful informando quando você pode e não pode usar as strings de consulta.
Os desenvolvedores começarão a perguntar por que estamos desperdiçando nosso esforço no suporte aos formatos Json e Xml, por que não concentrar nossos esforços em apenas um e fazê-lo bem?
Como as coisas deram tão errado
Vou te contar o que deu errado. Nós, como desenvolvedores, deixamos os departamentos de marketing aproveitarem nossa principal fraqueza. Nossa eterna busca pela bala de prata nos cegou para a realidade do que realmente é o REST. Na superfície, o REST parece tão fácil e simples. Nomeie seus recursos com URLs e use GET, PUT, POST e DELETE. Inferno, nós, os desenvolvedores, já sabemos como fazer isso, estamos lidando com bancos de dados há anos que possuem tabelas e colunas e instruções SQL que possuem SELECT, INSERT, UPDATE e DELETE. Deveria ter sido um pedaço de bolo.
Existem outras partes do REST que algumas pessoas discutem, como auto-descrição e restrição de hipermídia, mas essas restrições não são tão simples quanto a identificação de recursos e a interface uniforme. O parece adicionar complexidade onde o objetivo desejado é a simplicidade.
Essa versão diluída do REST foi validada na cultura do desenvolvedor de várias maneiras. Foram criadas estruturas de servidor que incentivavam a identificação de recursos e a interface uniforme, mas não faziam nada para suportar as outras restrições. Os termos começaram a flutuar em torno da diferenciação das abordagens (HI-REST x LO-REST, REST corporativo vs REST acadêmico, REST x RESTful).
Algumas pessoas gritam que, se você não aplicar todas as restrições, não será REST. Você não receberá os benefícios. Não há metade do REST. Mas essas vozes foram rotuladas como fanáticos religiosos que ficaram chateados com o fato de seu precioso termo ter sido roubado da obscuridade e tornado popular. Pessoas ciumentas que tentam fazer com que o REST pareça mais difícil do que é.
REST, o termo, definitivamente se tornou popular. Quase todas as principais propriedades da web que possuem uma API oferecem suporte a "REST". Twitter e Netflix são dois de alto perfil. O mais assustador é que só consigo pensar em uma API pública que seja auto-descritiva e há algumas que realmente implementam a restrição hipermídia. Certamente, alguns sites como o StackOverflow e o Gowalla suportam links em suas respostas, mas existem muitos buracos nos links. A API StackOverflow não possui página raiz. Imagine o sucesso do site se não houvesse uma página inicial para o site!
Você foi enganado, eu tenho medo
Se você chegou até aqui, a resposta curta para sua pergunta é que as APIs (Netflix e Twitter) não estão em conformidade com todas as restrições e, portanto, você não obterá os benefícios que as APIs REST devem trazer.
Os clientes REST demoram mais para serem construídos do que os clientes SOAP, mas não estão vinculados a um serviço específico, portanto, você poderá reutilizá-los entre os serviços. Tomemos o exemplo clássico de um navegador da web. Quantos serviços um navegador da web pode acessar? Que tal um leitor de feeds? Agora, quantos serviços diferentes o cliente médio do Twitter pode acessar? Sim, apenas um.
Os clientes REST não devem ser criados para interagir com um único serviço, eles devem ser criados para lidar com tipos de mídia específicos que poderiam ser atendidos por qualquer serviço. A questão óbvia é: como você pode construir um cliente REST para um serviço que entrega application / json ou application / xml. Bem, você não pode. Isso ocorre porque esses formatos são completamente inúteis para um cliente REST. Você mesmo disse,
você precisa fazer "palpites" sobre o que voltará ao canal, pois não há um esquema ou documento de referência real
Você está absolutamente correto para serviços como o Twitter. No entanto, a restrição auto-descritiva no REST diz que o cabeçalho do tipo de conteúdo HTTP deve descrever exatamente o conteúdo que está sendo transmitido pela conexão. Entregar application / json e application / xml não diz nada sobre o conteúdo.
Quando se trata de considerar o desempenho de sistemas baseados em REST, é necessário ter uma visão geral. Falar sobre bytes de envelope é como falar sobre desenrolamento de loop ao comparar uma classificação rápida a uma classificação de shell. Há cenários em que o SOAP pode ter um desempenho melhor e há cenários em que o REST pode ter um desempenho melhor. Contexto é tudo.
O REST obtém grande parte de sua vantagem de desempenho por ser muito flexível sobre os tipos de mídia suportados e por ter um suporte sofisticado para armazenamento em cache. Para que o cache funcione bem, embora quase todas as restrições devam ser respeitadas.
Seu último argumento sobre URLs legíveis é de longe o mais irônico. Se você realmente se comprometer com a restrição de hipermídia, cada URL poderá ser um GUID e o desenvolvedor do cliente não perderá nada na legibilidade.
O fato de os URIs serem opacos para o cliente é uma das coisas mais importantes ao desenvolver sistemas REST. URLs legíveis são convenientes para o desenvolvedor do servidor e URLs bem estruturados facilitam o envio da solicitação pela estrutura do servidor, mas esses são detalhes de implementação que não devem ter impacto nos desenvolvedores que consomem a API.
A API do Twitter não está nem perto de ser RESTful e é por isso que você não consegue ver nenhum benefício em usá-la no SOAP. A API da Netflix está muito mais próxima, mas o uso de tipos de mídia genéricos demonstra que a falta de adesão a uma única restrição pode ter um impacto profundo nos benefícios derivados do serviço.
Pode não ser tudo culpa deles
Fiz bastante despejo nos provedores de serviços, mas são necessários dois para dançar RESTfully. Um serviço pode seguir todas as restrições religiosamente e um cliente ainda pode desfazer facilmente todos os benefícios.
Se um cliente codifica os URLs para acessar determinados tipos de recursos, isso impede o servidor de alterar esses URLs. Qualquer tipo de construção de URL com base no conhecimento implícito de como o serviço estrutura seus URLs é uma violação.
Fazer suposições sobre que tipo de representação será retornado de um link pode levar a problemas. Fazer suposições sobre o conteúdo da representação com base no conhecimento que não é explicitamente declarado nos cabeçalhos HTTP definitivamente criará um acoplamento que causará problemas no futuro.
Eles deveriam ter usado SOAP?
Pessoalmente, acho que não. O REST feito corretamente permite que um sistema distribuído evolua a longo prazo. Se você estiver construindo sistemas distribuídos que possuem componentes desenvolvidos por pessoas diferentes e precisam durar muitos anos, o REST é uma opção muito boa.