Dois-je inclure un balisage HTML dans ma réponse JSON?

13

Dans un site de commerce électronique, lors de l'ajout d'un article à un panier, j'aimerais afficher une fenêtre contextuelle avec les options que vous pouvez choisir. Imaginez que vous commandez un iPod Shuffle et que vous devez maintenant choisir la couleur et le texte à graver.

J'aimerais que la fenêtre soit modale, donc j'utilise une lightbox remplie par un appel Ajax. Maintenant, j'ai deux options:

Option 1: envoyer uniquement les données et générer le balisage HTML à l'aide de JavaScript

Ce qui est bien, c'est qu'il réduit la demande Ajax au minimum et ne mélange pas les données avec le balisage.

Ce qui n'est pas si génial, c'est que je dois maintenant utiliser JavaScript pour faire mon rendu, au lieu d'avoir un moteur de modèle côté serveur. Je pourrais peut-être nettoyer un peu l'approche en utilisant une solution de modélisation côté client .

Option 2: envoyer le balisage HTML

Ce qui est bien, c'est que je peux avoir le même moteur de modèle côté serveur que j'utilise pour le reste de mes tâches de rendu (Django), faire le rendu de la lightbox. JavaScript n'est utilisé que pour insérer le fragment HTML dans la page. Il laisse donc clairement le rendu au moteur de rendu. Ça a du sens pour moi.

Mais je ne me sens pas à l'aise de mélanger les données et le balisage dans un appel Ajax pour une raison quelconque. Je ne sais pas ce qui me met mal à l'aise. Je veux dire, c'est la même façon dont chaque page Web est servie - données et balisage - non?

Mike M. Lin
la source
Grande question. Mais semble appartenir à stackoverflow.
Saeed Neamati
1
@SaeedNeamati Les questions de conception de logiciels, en particulier les questions conceptuelles du tableau blanc comme celle-ci sont sur le sujet ici et hors sujet sur Stack Overflow .

Réponses:

10

JSON devrait simplement contenir les données et aucun balisage. À long terme, cette approche est plus extensible car il existe un potentiel d'utilisation des données JSON dans d'autres parties de votre site. Si vous incluez le balisage, l'utilisation des mêmes données pour remplir un autre modèle devient beaucoup plus difficile.

davidk01
la source
2
Grand point sur la réutilisation. Tout le monde semble voter pour que la demande Ajax contienne uniquement des données, et pas de balisage, pour diverses raisons. Mais celui-ci est grand . Merci.
Mike M. Lin
2
Sans oublier que JSON sans balisage est plus petit et utilise moins de bande passante.
@JackManey: C'est également un bon point. Mais le véritable coût de la bande passante supplémentaire n'est pas tant que ça après avoir déjà mangé le coût de la requête HTTP. Et je peux imaginer certaines configurations où vous savez que les machines clientes sont tellement nulles qu'il vous en coûterait plus cher de générer le DOM en temps réel à l'aide de JavaScript. Pensez: applications internes avec des utilisateurs sur d'anciennes machines / navigateurs.
Mike M. Lin
3

J'enverrais les données dans la demande et créerais le balisage en js. Un avantage supplémentaire serait qu'il y aurait moins d'utilisation de la bande passante. C'est une sorte de préférence personnelle, mais garder le balisage côté client loin du côté serveur est probablement une meilleure idée. J'ai également un site Web Django et j'utilise uniquement le système de modèles pour mettre des variables json sur la page (une demande ajax de moins à faire) et utiliser des fichiers src lors du développement sur ma machine. Tout le côté client se fait avec ExtJS.

implorer
la source
J'aime votre idée de graver les données JSON dans la page - pas ici car je ne récupère pas les données supplémentaires jusqu'à ce que je sache quel article vous ajoutez à votre panier. Faire une demande pour la mise en page, puis une seconde pour les données semble être courant de nos jours. Le fait d'avoir les données dans une variable JavaScript élimine le besoin de la deuxième requête HTTP sans avoir deux bits de code de rendu différents (c.-à-d. Client et serveur).
Mike M. Lin
Oh je vois que votre serveur n'est pas assez avancé pour savoir ce que l'utilisateur va mettre dans le panier au préalable;).
suppliez le
1

Je pense que vous avez parlé des avantages et des inconvénients des deux. Pourquoi ne pas envisager une troisième option pour que le javascript de votre lightbox soit généré à partir d'une vue django. Votre JSON contient-il simplement les données pour le mettre à jour pour chaque vue?

Ce que vous devriez pouvoir faire est d'envelopper tout le code de modèle dans des variables javascript, puis de les générer avec javascript après avoir reçu la demande JSON côté client.

Ryan Gibbons
la source
Merci pour la réponse. C'est en fait ce que je voulais dire dans l'option 1. La lightbox en tant que conteneur serait gravée dans la page mais masquée. Les données JSON de la demande Ajax seraient utilisées pour générer le contenu dans le conteneur. Une partie de ce contenu serait balisée en HTML. Comment avez-vous interprété l'option 1? Peut - être que cela peut être ma troisième option.
Mike M. Lin
Je pensais à quelque chose dans le sens de ce stackoverflow.com/questions/6008908/… puis j'utilisais JSON pour remplacer les données après la charge initiale
Ryan Gibbons
0

Vous devez utiliser le moteur de modèle pour le balisage et conserver un champ caché quelque part pour stocker les valeurs, que vous pouvez ensuite trouver dans le document à l'aide d'un sélecteur.

Alex
la source