Ao comparar a estrutura REST [api] com um modelo OO, vejo essas semelhanças:
Ambos:
Os dados são orientados
- REST = Recursos
- OO = Objetos
Operação surround em torno de dados
- REST = surround VERBS (Get, Post, ...) em torno dos recursos
- OO = promove operação em torno de objetos por encapsulamento
No entanto, boas práticas de OO nem sempre permanecem nas APIs REST ao tentar aplicar o padrão de fachada, por exemplo: no REST, você não possui 1 controlador para manipular todas as solicitações E não oculta a complexidade interna do objeto.
Pelo contrário, o REST promove a publicação de recursos de todas as relações com um recurso e outro em pelo menos duas formas:
via relações de hierarquia de recursos (um contato do id 43 é composto por um endereço 453):
/api/contacts/43/addresses/453
via links em uma resposta json REST:
>> GET /api/contacts/43 << HTTP Response { id: 43, ... addresses: [{ id: 453, ... }], links: [{ favoriteAddress: { id: 453 } }] }
Voltando ao OO, o padrão de design da fachada respeita a Low Coupling
entre um objetoA e seu ' clienteB de objeto ' e High Cohesion
para esse objetoA e sua composição interna de objetos ( objetoC , objetoD ). Com a interface objectA , isso permite que um desenvolvedor limite o impacto no objeto B das mudanças internas do objeto A (no objeto C e no objeto D ), desde que a API do objeto A (operações) ainda seja respeitada.
No REST, os dados (recurso), as relações (links) e o comportamento (verbos) são explodidos em diferentes elementos e estão disponíveis para a web.
Jogando com o REST, eu sempre tenho impacto nas alterações de código entre meu cliente e servidor: porque eu tenho High Coupling
entre minhas Backbone.js
solicitações e Low Cohesion
entre recursos.
Eu nunca descobri como deixar meu Backbone.js javascript application
acordo com a descoberta de " recursos e recursos REST " promovida pelos links REST. Entendo que a WWW deve ser servida por vários servidores e que os elementos OO precisaram ser explodidos para serem atendidos por muitos hosts, mas para um cenário simples como "salvar" uma página que mostra um contato com seus endereços, Eu acabo com:
GET /api/contacts/43?embed=(addresses) [save button pressed] PUT /api/contacts/43 PUT /api/contacts/43/addresses/453
o que me levou a mover a responsabilidade transacional atômica da ação de salvar nos aplicativos dos navegadores (já que dois recursos podem ser endereçados separadamente).
Com isso em mente, se eu não puder simplificar meu desenvolvimento (os padrões de design do Facade não são aplicáveis) e se eu trouxer mais complexidade ao meu cliente (manipulando a economia de energia atômica), qual é o benefício de ser RESTful?
PUT /api/contacts/43
atualizações em cascata para objetos internos? Eu tinha muitas APIs projetadas assim (o URL mestre lê / cria / atualiza o "todo" e os sub-URLs atualizam as peças). Apenas certifique-se de não atualizar o endereço quando nenhuma alteração for necessária (por motivos de desempenho).