Isso é "antipadrão" e devo parar de usá-lo ou é um design inteligente?


10

Basicamente, comecei a fazer o seguinte ao criar um serviço REST:

  1. HTML é solicitado
  2. serviço retorna a página da web desejada, mas sem o "recurso" solicitado, por exemplo. dados
  3. página da web contém JavaScript que emite solicitação AJAX para o mesmo serviço (tipo de conteúdo diferente)
  4. serviço retorna os dados reais (JSON) e a página os exibe

Por um lado, parece ineficiente (2 solicitações), mas depois usei isso "desempenho não é motivo de preocupação", o que significa que o aplicativo interno de baixo tráfego e os sites são simples e carregam rápido.

A razão pela qual acabei com isso é que a página da Web pode ser quase pura Html + JavaScript e quase nenhuma coisa do lado do servidor é necessária, especialmente sem loops, para criar tabelas e coisas assim (que eu acho muito feia em comparação com coisas como slickgrid), por exemplo, separação de dados e exibição.

Agora, antes de começar a usar isso, é uma boa ideia ou devo parar de fazê-lo?


2
Se você deseja passar mais tempo com seus entes queridos e deseja ter tempo livre para desfrutar de hobbies ou buscar objetivos pessoais, então, pelo amor de Deus: não programe aplicativos como esse! Mas se você gosta de ficar até tarde da noite e nos fins de semana no escritório mantendo toneladas de códigos "inteligentes", convém.
Tulains Córdova

3
Você pode elaborar especificamente o que acha ruim? Contexto: Este não é um animal de 10 milhões de LOC, o que é crítico para os negócios. É mais ou menos <5000 LOC e não importa se não funcionar por alguns dias. Sim, não foi assim que eu deveria fazer coisas ruins, daí elaborar o que você acha que é tão ruim.
Iniciantes_

@begginer_ Todo software começa pequeno. O que você descreve rseembles uma Rube Goldberg máquina: homem martelo hits, homem cai biscoito, biscoitos papagaio garra e inclina vaso, etc.
Tulains Córdova

O motivo disso é muitas vezes para melhorar o desempenho, onde a busca de dados pode ser feita com várias solicitações simultâneas para o que podem ser diferentes servidores. Parece que isso não se aplica ao seu caso.
usar o seguinte comando

Como você usa esse serviço de clientes como scripts ou de curl? Essas coisas não têm intérpretes javascript. Isso é para um serviço somente de navegador?
Bryan Oakley

Respostas:


17

Se você solicitar um recurso e ele não contiver os dados, não será um serviço REST. O serviço que fornece os dados reais em json pode ser, mas a parte HTML não é. Para um aplicativo da web, isso não importa.

A técnica funciona, mas você precisa estar ciente de suas limitações:

  1. Os mecanismos de pesquisa não interpretam JavaScript, portanto, sites implementados assim não serão indexáveis ​​pelo Google e similares. Para aplicação interna, isso não importa; para um público, isso importaria muito.
  2. Usuários com necessidades especiais (como aqueles que usam terminais Braille) usam navegadores especiais bastante limitados e podem não interpretar o JavaScript corretamente.

Eu também observaria que o código que gera o HTML é basicamente o mesmo, seja ele executado no lado do servidor ou no lado do cliente. Você tem uma escolha muito maior de linguagens e estruturas no lado do servidor e tenho certeza de que existem vários equivalentes do slickgrid também.

Você pode, e deve, ainda manter a separação dos dados e a exibição no lado do servidor. O sistema de modelos pode, e deve, simplesmente levar os dados como estrutura de dados ou até json (especialmente se o serviço real estiver em um idioma diferente do sistema de modelos) e apenas expandir um modelo com esses dados.

E não, não estou pensando em PHP; é o sistema de modelos menos capaz do mercado (embora haja alguns melhores criados sobre ele). Estou pensando em Genshi ou XSLT ou algo ainda mais avançado que fornece widgets da web.


Eu escrevo clientes gordos em JavaScript, que fazem exatamente isso. Mas provavelmente é uma má ideia para sites normais.
K ..

Por que não é REST?
dagnelies

11
Se você distinguir entre os "dados" que formam o aplicativo (HTML, JS, CSS etc.) e os "dados" que o aplicativo exibe (JSON), a parte JSON é REST, mas a parte que carrega "código" não é ' t. Se você vê a coisa toda mais abstrata, ambas são.
..

2

Não há nada de errado em fazer isso, desde que você tenha certeza de estruturar seu código corretamente. Você pode até servir o conteúdo estático, por exemplo, de um Apache, e não do seu serviço da web.


2
O Apache é um exagero para o conteúdo estático. Existem servidores muito mais rápidos. O mais popular parece ser o Nginx .
Jan Hudec

5
Esse foi um exemplo, nada mais.
Steven Schlansker

2

Essa é uma boa prática. E isso é feito o tempo todo, como o @JanHudec aponta, chamá-lo de serviço REST está errado. Mas muitos sites fazem exatamente isso pelas razões apontadas.


11
... ea grande razão que muitos fazem é porque a interação de dados é através de serviços / JSON de qualquer maneira , por isso é provável melhor para lidar com toda a sua interação de dados da mesma forma. (ou seja, se você estiver usando AJAX para atualizar uma tabela ... você também deve usá-lo para construir a tabela em primeiro lugar.)
Chad Thompson

@ChadThompson Sim, acho que na maioria das vezes, se eu não criar coisas assim, em algum momento, receberei uma solicitação de recurso para atualizar dinamicamente a página com base no cliente que está fazendo algo - o que significa que uma implementação simples agora leva o cliente e o servidor a saber como criar a página. É mais fácil compilá-lo no cliente em primeiro lugar.
Tacroy

1

Eu não chamaria isso de antipadrão, o que você está descrevendo é mais ou menos um cliente gordo , não totalmente diferente de serviços como o Trello. A responsabilidade inicial do servidor é enviar o DOM e quaisquer recursos necessários para fazer o cliente funcionar. Trabalhei em projetos semelhantes em automação de data center e monitoramento de rede.

O cliente inicia como um DOM esparso, extrai alguns dados via XHR (às vezes via JSONP) e finalmente se conecta a um servidor de soquete. Um exemplo ainda mais básico seria um aplicativo de bate-papo.

A única razão para não fazer isso é que pode ser extremamente difícil de acertar. Se você estiver familiarizado com a programação funcional assíncrona e com todas as corridas e outros desafios que ela possa apresentar, não terá problemas em mantê-la. Mais importante, você não terá problemas para escrevê-lo, para que outras pessoas possam mantê-lo.

Se o pensamento de adicionar mais recursos começar a assustá-lo, ou você começar a achar que a depuração é um pesadelo, convém considerar outros métodos de produção enquanto continua experimentando e aprendendo.

É um design válido, desde que você não esteja cavando um buraco para si mesmo. Se você tem um monte de JS aleatórios em todos os lugares, em vez de uma interface limpa, provavelmente deseja re-fatorar ou executar o projeto de maneira diferente. A maioria das funções definidas para serem executadas quando todos os recursos são carregados deve ser anônima e inserida a partir de uma interface limpa. Se não estiverem, você pode ter problemas.


O que você quer dizer com "JS aleatório"? No meu caso, o que você está descrevendo acima é muito mais complexo do que eu tenho (alguns campos de entrada e uma tabela (slickgrid) ou abas jquery ui). É isso. Cerca de 200 LOC por página.
Iniciantes_

0

como @Jan Hudec disse, sua abordagem definitivamente não pode ser chamada de REST. Embora possa ser a parte em que o cliente solicita um recurso. É melhor que o cliente lide com a parte da apresentação, como backbonefaz. Ele se comunica com o servidor REST para os recursos e os exibe usando views.


0

Pode ser um anti-padrão, mas acho que também é o futuro dos aplicativos da web. Em vez de mexer no JavaScript, no entanto, você deve usar pelo menos uma biblioteca de modelos. Uma solução melhor é uma estrutura MVC do lado do cliente como o AngularJS (que por acaso estou usando agora).

Para mais algumas referências, aqui está uma postagem de blog popular comparando várias estruturas, e aqui está um site que implementa o mesmo programa usando várias estruturas.

Também: os comentários de Jan Hudec sobre interação com o mecanismo de pesquisa e leitores de tela são válidos. Se você estiver trabalhando em um site de comércio eletrônico (onde o pagerank é importante), provavelmente não deseja usar estruturas do lado do cliente. Mas para aplicativos internos, essas geralmente não são preocupações.


thx nunca ouviu falar de AngularJS. Mas acho que para as minhas necessidades atuais é demais.
Iniciantes_

0

O que você está fazendo parece bom! No entanto, se suas respostas json contiverem HTML, você estará perdendo seu tempo.

Outro ponto, porém, é que seu cliente burro provavelmente deve obter seus dados json de um projeto diferente. Você deve procurar a separação adequada entre cliente e serviço, para ter um serviço RESTful adequado

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.