Pourquoi est-il une mauvaise pratique de renvoyer du code HTML généré au lieu de JSON? Ou est-ce?

301

Il est assez facile de charger du contenu HTML à partir de vos URL / services Web personnalisés à l'aide de JQuery ou de tout autre cadre similaire. J'ai utilisé cette approche plusieurs fois et jusqu'à présent et j'ai trouvé les performances satisfaisantes.

Mais tous les livres, tous les experts essaient de me faire utiliser JSON au lieu de HTML généré. Comment est-il beaucoup plus supérieur que HTML?

Est-ce beaucoup plus rapide?
La charge sur le serveur est-elle bien moindre?

De l'autre côté, j'ai quelques raisons d'utiliser le HTML généré.

  1. C'est un balisage simple et souvent tout aussi compact ou même plus compact que JSON.
  2. C'est moins sujet aux erreurs car tout ce que vous obtenez est du balisage et pas de code.
  3. La programmation sera plus rapide dans la plupart des cas, car vous n'aurez pas à écrire de code séparément pour le client.

De quel côté êtes-vous et pourquoi?

Cyril Gupta
la source
il convient de noter que le X dans AJAX est XML, et HTML à un moment donné était censé être XML. L'idée était que le HTML était des données lisibles par l'homme et la machine (comme JSON), et CSS ferait la présentation. Dans ces conditions, il ne serait pas contraire à la "séparation des préoccupations" d'envoyer du HTML dans une demande AJAX
code_monk

Réponses:

255

Je suis un peu des deux côtés, en fait:

  • Lorsque ce dont j'ai besoin du côté javascript, ce sont des données , j'utilise JSON
  • Lorsque ce dont j'ai besoin du côté javascript est une présentation sur laquelle je ne ferai aucun calcul, j'utilise généralement du HTML

Le principal avantage de l'utilisation de HTML est lorsque vous souhaitez remplacer une partie complète de votre page par ce qui revient de la demande Ajax:

  • Reconstruire une partie de la page dans JS est (assez) difficile
  • Vous avez probablement déjà un moteur de template côté serveur, qui a été utilisé pour générer la page en premier lieu ... Pourquoi ne pas la réutiliser?

En général, je ne prends pas vraiment en compte le côté "performance" des choses, du moins sur le serveur:

  • Sur le serveur, la génération d'une partie de HTML ou de JSON ne fera probablement pas beaucoup de différence
  • À propos de la taille des éléments qui transitent par le réseau: eh bien, vous n'utilisez probablement pas des centaines de Ko de données / html ... L'utilisation de gzip sur tout ce que vous transférez est ce qui va faire la plus grande différence (ne pas choisir entre HTML et JSON)
  • Une chose qui pourrait être prise en considération, cependant, est de quelles ressources vous aurez besoin sur le client pour recréer le HTML (ou la structure DOM) à partir des données JSON ... comparez cela à pousser une partie de HTML dans la page; -)

Enfin, une chose qui compte vraiment:

  • Combien de temps cela vous prendra-t-il pour développer un nouveau système qui enverra des données sous forme de code JSON + le JS requis pour l'injecter en HTML dans la page?
  • Combien de temps faut-il pour renvoyer simplement du HTML? Et combien de temps si vous pouvez réutiliser une partie de votre code côté serveur déjà existant?


Et pour répondre à une autre réponse: si vous devez mettre à jour plus d'une partie de la page, il y a toujours la solution / hack d'envoyer toutes ces parties dans une grande chaîne qui regroupe plusieurs parties HTML et d'extraire les parties pertinentes dans JS.

Par exemple, vous pouvez renvoyer une chaîne qui ressemble à ceci:

<!-- MARKER_BEGIN_PART1 -->
here goes the html
code for part 1
<!-- MARKER_END_PART1 -->
<!-- MARKER_BEGIN_PART2 -->
here goes the html
code for part 2
<!-- MARKER_END_PART2 -->
<!-- MARKER_BEGIN_PART3 -->
here goes the json data
that will be used to build part 3
from the JS code
<!-- MARKER_END_PART3 -->

Cela n'a pas l'air vraiment bien, mais c'est vraiment utile (je l'ai utilisé plusieurs fois, surtout lorsque les données HTML étaient trop grandes pour être encapsulées dans JSON) : vous envoyez du HTML pour les parties de la page qui besoin de présentation, et vous envoyez JSON pour la situation dont vous avez besoin de données ...

... Et pour les extraire, la méthode de sous-chaîne JS fera l'affaire, je suppose ;-)

Pascal MARTIN
la source
6
Toutes les données sont finalement une présentation.
Cyril Gupta
47
@Cyril: Hein? Je pense que vous essayez de dire que les données, pour être utiles, doivent être utilisées et donc présentées quelque part sous une forme quelconque, et je suis d'accord. Mais dire que les données sont une présentation semble pour le moins malavisé.
Vinko Vrsalovic
10
Salut Vinko, remarquez le «finalement»? Je veux dire exactement ce que tu veux dire. J'essaie juste d'entrer dans le livre des citations citables ici. Ha ha!
Cyril Gupta
37
La question fondamentale est de savoir si vous êtes absolument, positivement, finalement sûr que vous n'utiliserez pas ces données pour autre chose que du HTML. Parce qu'une fois compressées en HTML, les données seront presque irrécupérables. Avec JSON, votre backend peut fonctionner avec XML, SVG, les moteurs de base de données, l'API intersite et un millier d'autres frontaux et systèmes pouvant accepter JSON. Avec HTML, vous ne pourrez l'utiliser que dans HTML.
SF.
3
@SF: Lors du retour de HTML depuis le serveur, je m'assure de séparer le code de génération HTML du code qui accède à la base de données. De cette façon, je peux également ajouter facilement un formulaire JSON.
Casebash
114

Je suis principalement d'accord avec les opinions exprimées ici. Je voulais juste les résumer comme suit:

  • Il est déconseillé d'envoyer du HTML si vous finissez par l'analyser côté client pour effectuer des calculs par-dessus.

  • C'est une mauvaise pratique d'envoyer du JSON si tout ce que vous finirez par faire est de l'incorporer dans l'arborescence DOM de la page.

Vinko Vrsalovic
la source
3
que se passe-t-il si vous devez faire des calculs et l'incorporer également au DOM de la page?
Enrique
Je me demande combien de temps la déclaration ci-dessus aura une véracité attachée, Si vous ajoutez la " demi-vie de la connaissance " dans l'équation?
Val
est-il possible de retourner un HTML qui a des balises <script> puis de les exécuter côté client lors du chargement de la page?
nish1013
Ce. Aussi, si vous renvoyez des données qui doivent être fluides dans leur présentation d'une manière ou d'une autre, par exemple si vous avez un tableau HTML avec des colonnes que vous souhaitez pouvoir trier. Que vous les ayez rendus triables maintenant ou non, vous voudrez peut-être plus tard, donc dans un tel cas, la pérennité vaut l'effort supplémentaire de suivre la route JSON.
trpt4him
J'ajouterais également, si vous demandez des URL d'images via JSON juste pour essayer de les rendre sur la page, il est beaucoup plus performant de les inclure en HTML dès le début, afin que les images puissent commencer à se charger plus tôt (avant que votre ajax ne revienne) .
FailedUnitTest
30

Bien,

Je fais partie de ces rares personnes qui aiment séparer les choses de cette façon: - Le serveur est responsable de la livraison des données (modèle); - Le client est responsable de l'affichage (vue) et de la manipulation des données (modèle);

Ainsi, le serveur doit se concentrer sur la livraison du modèle (dans ce cas, JSON est meilleur). De cette façon, vous obtenez une approche flexible. Si vous voulez changer la vue de votre modèle, vous gardez le serveur envoyant les mêmes données et changez simplement le client, les composants javascript, qui changent ces données en vue. Imaginez, vous disposez d'un serveur fournissant des données aux appareils mobiles ainsi qu'aux applications de bureau.

De plus, cette approche augmente la productivité, car le code du serveur et du client peuvent être construits en même temps, sans jamais perdre le focus, ce qui se passe lorsque vous passez de js à PHP / JAVA / etc.

En général, je pense que la plupart des gens préfèrent en faire autant que possible côté serveur car ils ne maîtrisent pas js, ils essaient donc de l'éviter autant que possible.

Fondamentalement, j'ai la même opinion que les gars qui travaillent sur Angular. À mon avis, c'est l'avenir des applications Web.

ramaralo
la source
Oui, je suis totalement d'accord avec toi. Cependant, en faisant autant côté serveur lorsque des informations sensibles sont concernées, je jugerais préférable. Si vous avez besoin que le client réagisse différemment selon le résultat, j'utiliserais json sinon j'utiliserais html.
Fi Horan du
9

J'ai quelque chose d'intéressant que je pensais pouvoir ajouter. J'ai développé une application qui n'a chargé qu'une seule fois une vue complète. À partir de ce moment-là, il n'a communiqué avec le serveur qu'avec ajax. Il n'a jamais eu besoin de charger qu'une seule page (ma raison en est sans importance ici). La partie intéressante vient du fait que j'avais un besoin particulier de retourner certaines données à exploiter dans le javascript ET une vue partielle à afficher. J'aurais pu diviser cela en deux appels à deux méthodes d'action distinctes mais j'ai décidé d'aller avec quelque chose d'un peu plus amusant.

Vérifiez-le:

public JsonResult MyJsonObject(string someData)
{
     return Json(new { SomeData = someData, PartialView = RenderPartialViewToString("JsonPartialView", null) }, JsonRequestBehavior.AllowGet);
}

Qu'est-ce que RenderPartialViewToString () vous pourriez demander? C'est cette petite pépite de fraîcheur ici:

protected string RenderPartialViewToString(string viewName, object model)
{
     ViewData.Model = model;

     using (StringWriter sw = new StringWriter())
     {
          ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
          ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
          viewResult.View.Render(viewContext, sw);

          return sw.GetStringBuilder().ToString();
     }
}

Je n'ai fait aucun test de performance sur ce sujet, donc je ne sais pas si cela entraîne plus ou moins de surcharge que d'appeler une méthode d'action pour JsonResult et une pour ParticalViewResult, mais je pensais toujours que c'était assez cool. Il sérialise simplement une vue partielle dans une chaîne et l'envoie avec le Json comme l'un de ses paramètres. J'utilise ensuite JQuery pour prendre ce paramètre et le gifler dans son nœud DOM approprié :)

Dites-moi ce que vous pensez de mon hybride!

Chev
la source
1
L'envoi de la vue rendue et des données dans une seule demande semble un peu redondant. Je plaisante, si vous aviez la possibilité de faire un rendu de vue côté client, il serait encore mieux d'envoyer le modèle de vue et les données sous forme de demandes distinctes. Il a fallu une demande supplémentaire mais une seule fois car la demande de modèle sera mise en cache pour les demandes suivantes. Idéalement, il serait préférable d'utiliser une combinaison de rendu de vue côté client et côté serveur afin de pouvoir créer des pages sur le serveur et des partiels dans le navigateur, mais si vous implémentez uniquement le rendu de vue côté serveur, ce n'est pas une mauvaise approche.
Evan Plaice
8

Si la réponse ne nécessite aucun autre traitement côté client, le HTML est OK à mon avis. L'envoi de JSON ne vous obligera qu'à effectuer ce traitement côté client.

D'un autre côté, j'utilise JSON lorsque je ne veux pas utiliser toutes les données de réponse à la fois. Par exemple, j'ai une série de trois sélections chaînées, où la valeur sélectionnée de l'un détermine quelles valeurs vont être utilisées pour remplir la seconde, et ainsi de suite.

Ionuț G. Stan
la source
7

IMV, il s'agit de séparer les données de la présentation des données, mais je suis avec Pascal, il ne s'ensuit pas nécessairement que cette séparation ne peut se faire qu'à travers la frontière client / serveur. Si vous avez déjà cette séparation (sur le serveur) et que vous souhaitez simplement montrer quelque chose au client, que vous renvoyiez JSON et le post-traitiez sur le client, ou renvoyiez simplement du HTML, cela dépend entièrement de vos besoins. Dire que vous avez «tort» de renvoyer du code HTML dans le cas général est tout simplement trop clair pour une déclaration IMV.

TJ Crowder
la source
6

JSON est un format très polyvalent et léger. J'ai découvert sa beauté lorsque j'ai commencé à l'utiliser comme données d'analyseur de modèle côté client. Laissez-moi vous expliquer, alors qu'avant j'utilisais smarty et les vues côté serveur (générant une charge de serveur élevée), maintenant j'utilise certaines fonctions jquery personnalisées et toutes les données sont rendues côté client, en utilisant le navigateur clients comme analyseur de modèle. il enregistre les ressources du serveur et, d'autre part, les navigateurs améliorent quotidiennement leurs moteurs JS. Par conséquent, la vitesse d'analyse du client n'est pas un problème important pour le moment, d'autant plus que les objets JSON sont généralement très petits, de sorte qu'ils ne consomment pas beaucoup de ressources côté client. Je préfère avoir un site Web lent pour certains utilisateurs avec un navigateur lent plutôt qu'un site lent pour tout le monde en raison du serveur très chargé.

D'un autre côté, envoyer des données pures à partir du serveur vous les soustrayez de la présentation, donc si demain vous voulez les changer ou intégrer vos données dans un autre service, vous pouvez le faire beaucoup plus facilement.

Juste mes 2 cents.

Mike
la source
Et comment vous assurez-vous d'obtenir une page lisible lorsque le javascript est désactivé?
Vinko Vrsalovic
8
si JS est désactivé, vous ne pourrez pas charger le html également. JS est désactivé sur 2,3% des utilisateurs selon mes statistiques Google Analytics. La meilleure façon de descendre est d'essayer de plaire à tout le monde.
Mike
4
Je suis d'accord à 100% avec Mike. Essayer de plaire à tout le monde est impossible et ne fera que vous blesser. Si les utilisateurs désactivent JS, ils doivent être habitués à de nombreux sites qui ne fonctionnent pas pour eux à l'heure actuelle.
Chev
1
Comment obtenir des statistiques JavaScript dans Analytics, car Analytics utilise Javascript pour suivre les données?
Nick
@Nick Bonne question, mais j'ai trouvé ceci: stackoverflow.com/questions/15265883/…
Renan Cavalieri
6

Si vous voulez un client découplé propre, ce qui à mon avis est la meilleure pratique, alors il est logique d'avoir 100% du DOM créé par javascript. Si vous créez un client basé sur MVC qui possède tout le savoir-faire pour créer l'interface utilisateur, vos utilisateurs téléchargent un fichier javascript une fois et il est mis en cache sur le client. Toutes les demandes après ce chargement initial sont basées sur Ajax et ne renvoient que des données. Cette approche est la plus propre que j'ai trouvée et permet une encapsulation propre et indépendante de la présentation.

Le côté serveur se concentre alors uniquement sur la livraison des données.

Donc, demain, lorsque le produit vous demandera de modifier complètement la conception d'une page, tout ce que vous changez est le JS source qui crée le DOM, mais vous risquez de réutiliser vos gestionnaires d'événements déjà existants et le serveur est inconscient car il est découplé à 100% de la présentation

Lance Caraccioli
la source
1
Je suis d'accord, vous pouvez également réutiliser le json pour votre application mobile.
Alex Shilman
Cela aurait dû être la réponse acceptée - les 6 à 7 premiers mots répondent succinctement à la question.
nicholaswmin
Se mettre d'accord. L'avantage des données de retour (JSON) par rapport à la présentation (html) est que vous avez maintenant une API Web "gratuite" qui peut être réutilisée pour d'autres clients, qu'elle soit mobile ou une application complètement différente qui s'intéresse à certaines données de cette application etc. D'après mon expérience, l'utilisation d'un cadre Web simple côté serveur qui ne traite que des données et non de la présentation conduit souvent à des résultats bons et simples. Le navigateur et les processeurs modernes sont si rapides que ce n'est que dans des cas particuliers que le rendu sera un goulot d'étranglement. Le plus gros goulot d'étranglement étant principalement le réseau lui-même et l'appel à la base de données.
beginner_
4

Selon votre interface utilisateur, vous devrez peut-être mettre à jour deux (ou plus) éléments différents dans votre DOM. Si votre réponse est en HTML, allez-vous analyser cela pour savoir ce qui va où? Ou vous pouvez simplement utiliser un hachage JSON.

Vous pouvez même le combiner, renvoyer un JSON avec des données html :)

{ 'dom_ele_1' : '<p>My HTML part 1</p>', 'dome_ele_2' : '<div>Your payment has been received</div>' }
tchen
la source
C'est une mauvaise pratique d'envoyer du JSON si tout ce que vous finirez par faire est de l'incorporer dans l'arborescence DOM de la page ... et en combinant JSON avec HTML, vous utilisez cette mauvaise pratique
thermz
2

Le HTML contient de nombreuses données redondantes et non affichées, c.-à-d. Des balises, des feuilles de style, etc. Ainsi, la taille du HTML par rapport aux données JSON sera plus grande, ce qui augmentera le temps de téléchargement et de rendu et le navigateur sera également occupé à rendre les nouvelles données.

John Saman
la source
1

L'envoi de json se fait généralement lorsque vous avez un widget javascript demandant des informations au serveur, comme une liste ou une arborescence ou une saisie semi-automatique. C'est à ce moment que j'enverrais JSON car ce sont des données qui seront analysées et utilisées brutes. Cependant, si vous allez simplement afficher du HTML, il vous faudra beaucoup moins de travail pour le générer côté serveur et l'afficher simplement sur le navigateur. Les navigateurs sont optimisés pour insérer du HTML directement dans le dom avec innerHTML = "", vous ne pouvez donc pas vous tromper avec cela.

Zoidberg
la source
FWIW, innerHTMLest historiquement beaucoup plus lent qu'un fragment de document: coderwall.com/p/o9ws2g/… .
Nate Whittaker
0

Je pense que cela dépend de la structure de la conception, c'est juste plus sexy d'utiliser JSON que HTML mais la question est de savoir comment le gérer pour qu'il soit facile à entretenir.

Par exemple, disons que j'ai la page de liste qui utilise le même html / style de l'ensemble du site, j'écrirais la fonction globale pour formater ces parties de HTML et tout ce que j'ai à faire est de passer l'objet JSON dans la fonction.

Methee
la source
0

La réponse HTML est suffisante dans la plupart des cas, sauf si vous devez effectuer des calculs côté client.

Mubashir
la source
0

Dépend des circonstances.

Parfois, il est essentiel d'éviter JSON. Lorsque nos programmeurs ont du mal à programmer en js, par exemple.

Mon expérience me dit que: mieux utiliser le service ajax que JSON en ligne.

Tôt ou tard, le js devient un problème

Alegoric
la source