Est-ce un «anti-motif» et dois-je arrêter de l'utiliser ou est-ce une conception intelligente?

10

J'ai essentiellement commencé à faire ce qui suit lors de la création d'un service REST:

  1. HTML est demandé
  2. le service renvoie la page Web souhaitée mais sans la "ressource" demandée, par exemple. Les données
  3. la page Web contient du JavaScript qui émet une demande AJAX vers le même service (type de contenu différent)
  4. le service renvoie ensuite les données réelles (JSON) et la page les affiche

D'un côté, cela semble inefficace (2 demandes), mais lorsque j'ai été utilisé, "les performances ne sont pas préoccupantes", ce qui signifie que l'application interne à faible trafic et les sites Web sont simples et se chargent rapidement.

La raison pour laquelle je me suis retrouvé avec cela est que la page Web peut alors être presque pure Html + JavaScript et presque aucun truc côté serveur n'est requis, en particulier pas de boucles, pour créer des tableaux et des trucs comme ça (ce qui je pense est très moche par rapport à des choses comme slickgrid), par exemple la séparation des données et de la vue.

Maintenant, avant de commencer à l'utiliser, est-ce une bonne idée ou dois-je simplement arrêter de le faire?

débutant_
la source
2
Si vous voulez passer plus de temps avec vos proches et que vous souhaitez avoir du temps libre pour profiter des loisirs ou poursuivre des objectifs personnels, alors pour l'amour de Dieu: ne programmez pas des applications comme ça! Mais si vous aimez rester tard dans la nuit et le week-end au bureau en conservant des tonnes de code "intelligent", alors faites-vous plaisir.
Tulains Córdova
3
Pouvez-vous préciser ce que vous pensez être mauvais? Contexte: Ce n'est pas une bête LOC de 10 Mio qui est critique pour l'entreprise. Cela ressemble plus à <5000 LOC et n'a pas d'importance si cela ne fonctionne pas pendant quelques jours. Oui, cela ne veut pas dire que je devrais faire des trucs de merde, donc élaborte ce que tu penses être si mauvais.
débutant_
@begginer_ Chaque logiciel commence petit. Ce que vous décrivez ressemble à une machine Rube Goldberg: un marteau frappe un homme, un homme laisse tomber un biscuit, un biscuit à la perroquet et incline un vase, etc.
Tulains Córdova
La raison pour laquelle cela est fait est souvent d'améliorer les performances, où l'extraction de données peut être effectuée avec plusieurs demandes simultanées vers ce qui pourrait bien être des serveurs différents. Il ne semble pas que cela s'applique à votre cas.
user16764
Comment utilisez-vous ce service à partir de clients tels que des scripts ou de curl? Ces choses n'ont pas d'interprètes javascript. Est-ce pour un service uniquement par navigateur?
Bryan Oakley

Réponses:

17

Si vous demandez une ressource et qu'elle ne contient pas les données, ce n'est pas un service REST. Le service fournissant les données réelles dans json peut l'être, mais la partie HTML ne l'est pas. Pour une application Web, cela n'a pas d'importance.

La technique fonctionne, mais vous devez être conscient de ses limites:

  1. Les moteurs de recherche n'interprètent pas JavaScript, donc le site implémenté comme ça ne sera pas indexable par Google et autres. Pour une application interne, cela n'a pas d'importance, pour un public en face, cela importerait beaucoup.
  2. Les utilisateurs ayant des besoins spéciaux (comme ceux qui utilisent des terminaux braille) utilisent des navigateurs spéciaux qui sont plutôt limités et peuvent ne pas interpréter correctement le JavaScript.

Je voudrais également noter que le code générant le HTML est fondamentalement le même, qu'il s'exécute côté serveur ou côté client. Vous disposez d'un choix beaucoup plus large de langages et de frameworks côté serveur et je suis sûr qu'il existe également plusieurs équivalents de slickgrid.

Vous pouvez et devez toujours maintenir la séparation des données et l'affichage côté serveur. Le système de modèles peut et doit simplement prendre les données en tant que structure de données ou même json (en particulier si le service réel est dans une langue différente de celle du système de modèles) et simplement développer un modèle avec ces données.

Et non, je ne pense pas à PHP; c'est le système de modèles le moins performant (bien qu'il y en ait de meilleurs construits dessus). Je pense à Genshi ou XSLT ou à quelque chose d'encore plus avancé qui fournit des widgets Web.

Jan Hudec
la source
J'écris des gros clients en JavaScript, qui font exactement cela. Mais c'est probablement une mauvaise idée pour les sites Web normaux.
K ..
Pourquoi n'est-ce pas REST?
dagnelies
1
Si vous faites la distinction entre les "données" qui forment l'application (HTML, JS, CSS, etc.) et les "données" que l'application affiche (JSON), la partie JSON est REST, mais la partie qui charge le "code" n'est pas ' t. Si vous voyez le tout plus abstrait, les deux le sont.
K ..
2

Il n'y a rien de mal à faire cela, tant que vous vous assurez de bien structurer votre code. Vous pouvez même servir le contenu statique, par exemple à partir d'un Apache plutôt que de votre service Web.

Steven Schlansker
la source
2
Apache est un excès de contenu statique. Il existe des serveurs beaucoup plus rapides. Le plus populaire semble être Nginx .
Jan Hudec
5
C'était un exemple, rien de plus.
Steven Schlansker
2

C'est une bonne pratique. Et c'est fait tout le temps, même si le souligne @JanHudec, l'appeler un service REST est faux. Mais de nombreux sites Web font exactement cela pour les raisons que vous mentionnez.

Ross Patterson
la source
1
... et la grande raison que beaucoup le font parce que l' interaction des données est par les services / JSON de toute façon , il est donc susceptible de mieux gérer l' ensemble de vos interactions de données de la même manière. (c'est-à-dire si vous utilisez AJAX pour actualiser une table ... vous devriez également l'utiliser pour construire la table en premier lieu.)
Chad Thompson
@ChadThompson Oui, je trouve que la plupart du temps si je ne construis pas des choses comme ça en premier lieu, quelque part sur la ligne, j'obtiendrai une demande de fonctionnalité pour mettre à jour dynamiquement la page en fonction du client faisant quelque chose - qui signifie qu'une simple implémentation permet désormais au client et au serveur de savoir comment créer la page. Il est plus facile de simplement le construire sur le client en premier lieu.
Tacroy
1

Je ne dirais pas que c'est un anti-modèle, ce que vous décrivez est plus ou moins un gros client , pas totalement différent des services tels que Trello. La responsabilité initiale du serveur est d'envoyer le DOM et toutes les ressources nécessaires pour faire fonctionner le client. J'ai travaillé sur des projets similaires dans l'automatisation des centres de données et la surveillance des réseaux.

Le client démarre comme un DOM clairsemé, récupère certaines données via XHR (parfois via JSONP) et se connecte finalement à un serveur de socket. Un exemple encore plus basique serait une application de chat.

La seule raison de ne pas le faire est qu'il peut être extrêmement difficile de bien faire les choses. Si vous êtes à l'aise avec la programmation fonctionnelle asynchrone et toutes les courses et autres défis qu'elle peut présenter, vous n'aurez aucun problème à la maintenir. Plus important encore, vous n'aurez aucun problème à l'écrire afin que d' autres personnes puissent éventuellement le maintenir.

Si l'idée d'ajouter plus de fonctionnalités commence à vous faire peur, ou si vous commencez à découvrir que le débogage est un cauchemar, alors vous voudrez peut-être envisager d'autres méthodes de production pendant que vous continuez à expérimenter et à apprendre.

C'est une conception valide tant que vous ne creusez pas un trou pour vous-même. Si vous avez des gobs et des gobs de JS aléatoires partout au lieu d'une interface propre, vous voudrez probablement re-factoriser ou aborder le projet différemment. La plupart de vos fonctions définies pour s'exécuter une fois toutes les ressources chargées doivent être anonymes et saisies à partir d'une interface propre. S'ils ne le sont pas, vous pourriez vous diriger vers des ennuis.

Tim Post
la source
Qu'entendez-vous par "JS aléatoire"? Dans mon cas, ce que vous décrivez ci-dessus est beaucoup plus complexe que ce que j'ai (quelques champs de saisie et une table (slickgrid) ou des onglets jquery ui). C'est ça. Environ 200 LOC par page.
débutant_
0

comme l'a dit @Jan Hudec, votre approche ne peut certainement pas être appelée REST. Bien que la partie où le client demande une ressource puisse être. Il vaut mieux que le client gère la partie présentation, comme le backbonefait. Il communique avec le serveur REST pour les ressources et les affiche à l'aide views.

Broncha
la source
0

C'est peut-être un anti-pattern, mais je pense que c'est aussi l'avenir des applications web. Plutôt que de vous occuper de JavaScript, vous devriez au moins utiliser une bibliothèque de modèles. Une meilleure solution est un framework MVC côté client comme AngularJS (que j'utilise actuellement).

Pour d'autres références, voici un article de blog populaire comparant plusieurs cadres, et voici un site qui implémente le même programme en utilisant plusieurs cadres.

Aussi: les commentaires de Jan Hudec sur l'interaction avec les moteurs de recherche et les lecteurs d'écran sont valables. Si vous travaillez sur un site de commerce électronique (où le pagerank est important), vous ne voudrez probablement pas utiliser des cadres côté client. Mais pour les applications internes, ce ne sont généralement pas des problèmes.

parsifal
la source
thx n'a jamais entendu parler d'AngularJS. Mais je pense que pour mes besoins actuels, c'est trop.
débutant_
0

Ce que vous faites sonne bien! Cependant, si vos réponses json contiennent du HTML, vous perdez votre temps.

Un autre point est que votre client stupide devrait probablement obtenir ses données json d'un projet différent. Vous devez viser une séparation appropriée entre le client et le service, vous aurez alors un service RESTful approprié

Keith Pincombe
la source