Serviço MVC e API RESTful

12

O MVC é bem direto. Há um modelo, um controlador e uma vista. Quando criamos um site, tudo se reúne quando o ' cliente envia a solicitação de palavra-chave REST ao servidor -> o servidor corresponde à URL solicitada à ação do controlador -> que então chama o (s) modelo (s) para coleta / processamento de dados e obtém o resultado -> e retorna o resultado de volta ao cliente como uma página HTML (visualização) '.

E se estivermos falando de um serviço da Web API RESTful puro? Em seguida, o fluxo será algo como ' client envia solicitação de palavra-chave REST ao servidor -> o servidor corresponde à URL solicitada à ação do controlador -> que chama os modelos para coleta / processamento de dados, obtém o resultado -> e retorna o resultado de volta ao cliente em JSON '. O mesmo que antes, mas não há 'view' ... ou melhor, o JSON gerado pode ser pensado como uma 'view'. Em certo sentido, estamos utilizando apenas a parte MC do MVC. É assim que deve ser feito? Ou existem outros padrões mais adequados para um serviço somente API em vez do MVC?

simon
fonte

Respostas:

21

MVC é um paradigma do mundo Smalltalk preocupado com a forma como os sistemas orientados a objetos podem ter interfaces de usuário.

As estruturas da Web anteriores adotaram a ideia geral (separar a lógica de negócios, controlar a lógica e visualizar a lógica) e aplicaram o princípio de como elas estruturavam o aplicativo da Web. Antes disso, não era incomum ter Deus uma bagunça terrível de código de geração HTML dentro de objetos de domínio ou lógica de negócios dentro de modelos HTML (pense muito cedo no PHP)

O fato é que o MVC original do mundo Smalltalk não é realmente o que o MVC é na maioria das estruturas da web. Uma saída HTML não é realmente uma "visualização" no sentido em que o Smalltalk entendeu que era uma tela da interface do usuário.

Portanto, esse é o primeiro motivo para não ficar muito confuso se você está seguindo o MVC corretamente. Quase nada é. Tome menos como uma divisão estrita e mais uma diretriz de Hey, não seria bom se nossos modelos HTML não estivessem cheios de lógica de negócios.

Em segundo lugar, o MVC é apenas uma maneira de estruturar o código do lado do servidor. Realmente não tem nada a ver com REST / HTTP. O REST está preocupado com a forma como os clientes e servidores se comunicam. Não importa se a representação que o servidor envia ao cliente está em um modelo HTML que demorou muito para ser construído com um mecanismo de modelagem ou um objeto JSON que era uma chamada no controlador.

Se você não acha que seu servidor precisa de uma camada de "visualização" adequada. Você ainda obterá benefícios ao separar sua lógica de negócios (modelo) dos controladores que estão manipulando uma solicitação HTTP específica, mesmo que todo o controlador chame uma chamada de análise JSON em algum objeto e retorne esses dados.

Cormac Mulhall
fonte
Exatamente o que eu precisava ouvir. Eu venho do mundo dos desenvolvedores da web (ao longo dos scripts de um arquivo), então não vi como os aplicativos de larga escala que não são da Web são geralmente estruturados. O sistema que estou implementando atualmente vai muito além de um aplicativo Web comum. Portanto, pelo que li até agora, não importa realmente como você estrutura a fonte do aplicativo, o principal objetivo é facilitar a navegação e a manutenção. Usarei conceitos do padrão MVC para estruturar meu aplicativo. Obrigado!
simon
@lime ... o objetivo principal é facilitar a navegação e a manutenção. Esse não é sempre o objetivo?
Andy
@ David Packer, é claro que é =) Eu estava muito preso a um conceito, perdendo o uso real desse conceito.
simon
11
Confira a apresentação de Bob Martin sobre Arquitetura Limpa, se você quiser ver uma maneira diferente e potencialmente melhor de estruturar um aplicativo do que muitas estruturas da Web.
Cormac Mulhall
9

View é uma camada responsável por exibir informações que podem ser interpretadas por um usuário / cliente do seu aplicativo (não diz que o usuário precisa ser uma pessoa real). JSON é um formato completamente válido para uma camada de visualização, os computadores entendem isso.

Desde que a camada de visualização publique informações que podem ser usadas por um usuário para afetar modelos em seu aplicativo, não importa como a visualização seja, ainda é uma visualização, uma camada atuando como um middleware entre o usuário e o sistema .

Andy
fonte
2

O MVC é bem direto.

Martin Fowler talvez discordasse disso :

Pessoas diferentes que leem sobre o MVC em lugares diferentes pegam idéias diferentes e as descrevem como 'MVC'.

Se movendo...

Quando criamos um site, tudo se reúne quando o 'cliente envia a solicitação de palavra-chave REST ao servidor -> o servidor corresponde à URL solicitada à ação do controlador -> que então chama o (s) modelo (s) para coleta / processamento de dados e obtém o resultado -> e retorna o resultado de volta ao cliente como uma página HTML (visualização) '.

OK, isso é um emaranhado

O MVC, seja o que for, é uma coleção de idéias para implementar interfaces de usuário.

O REST é uma coleção de restrições arquiteturais para a criação de aplicativos em larga escala.

A web, que é o que você está falando aqui, é um aplicativo gigante de gerenciamento de documentos criado usando a maioria dessas mesmas restrições.

As semelhanças que você está vendo entre os dois são (faça a sua escolha) atribuídas incorretamente ou superficiais.

Os RESTafarians têm um entendimento comum do HATEOAS , "hipertexto como o mecanismo do estado do aplicativo", e isso deve enviar alarmes tocando em sua cabeça - por que uma visão seria um mecanismo de estado ? Se questionarmos a premissa e procurarmos evidências adicionais, também poderemos notar duas coisas estranhas.

Primeiro, podemos tirar completamente o servidor HTTP da equação carregando o HTML do disco. O navegador está perfeitamente satisfeito com isso, desculpando algumas variações menores no comportamento que podem surgir da alteração no URL base. As visualizações geralmente não continuam a funcionar quando foram completamente desconectadas do modelo e do controlador assim.

Segundo, se observarmos cuidadosamente um navegador moderno, perceberemos que há várias visualizações do HTML. Várias visualizações de uma exibição parecem uma idéia realmente estranha, mas com certeza há a apresentação principal, com várias marcações de texto que respondem a gestos do usuário e, em seguida, há essa coisa "Visualização de origem" que mostra o HTML bruto e também responde a gestos do usuário. São tartarugas até o fim!

A resposta para o enigma, é claro, é que o HTML não é a visão. A coleção de widgets no navegador é a visualização e eles estão em comunicação com o Document Object Model , que foi inicializado pela leitura do HTML.

Em outras palavras, o HTML é uma representação do estado, como Roy T. Fielding prometeu.

E se estivermos falando de um serviço da Web API RESTful puro ...? O mesmo de antes, mas não há 'visão'

Mais corretamente, o mesmo de antes: não há visualização. O JSON, assim como o HTML, é uma representação de estado, adequada para cruzar os limites do processo.

Pense em "DTO" ou "Mensagem" e suas inferências terão muito menos probabilidade de se desviar.

VoiceOfUnreason
fonte
Misturei solicitações da Web com um padrão arquitetural para ilustrar mais facilmente o que me incomoda no conceito como um todo. Você está dizendo: "A coleção de widgets no navegador é o ponto de vista" - então refiz a frase: e se não houver 'navegador' em uma cena humana? E se for outro robô conectado ao serviço? Se JSON e HTML são a representação do estado, 'uma mensagem' ou 'DTO' é um transporte para a representação do estado. Então, onde é que 'uma visão' ocorre? Você me confundiu ainda mais com sua resposta.
simon
O programa / robô conectado ao serviço provavelmente manipularia o modelo diretamente - por que ele precisaria de uma visualização?
VoiceOfUnreason
1

É assim que deve ser feito?

Passar o JSON como uma visualização ou usá-lo como um modelo de visualização para construir a visualização não viola o padrão.

Estou usando a mesma arquitetura no aplicativo atual em que estou trabalhando e está funcionando muito bem. Juntamente com uma estrutura JS agradável, você pode criar alguns designs realmente responsivos.

Ou existem outros padrões mais adequados para um serviço somente API em vez do MVC?

Honestamente, não faço ideia. Mas acho que se você usa MVC ou não em uma API não é tão importante. Use o que achar conveniente. Ao falar sobre serviços da Web, há aspectos muito mais importantes a serem considerados (que não estão diretamente relacionados ao MVC), por exemplo, segurança, consistência, disponibilidade etc.

djvuk
fonte