Dlaczego zwracanie wygenerowanego HTML zamiast JSON jest złą praktyką? A może jest?

Dość łatwo jest załadować zawartość HTML z niestandardowych adresów URL/usług internetowych za pomocą JQuery lub innego podobnego frameworka. Używałem tego podejścia wiele razy i do tej pory uznałem, że wydajność jest zadowalająca.

Ale wszystkie książki, wszyscy eksperci próbują zmusić mnie do używania JSON zamiast generowanego HTML. Jak to jest o wiele lepsze niż HTML?

Jest dużo szybciej?
Czy ma znacznie mniejsze obciążenie serwera?

Po drugiej stronie mam niektóre powody korzystania z wygenerowanego HTML.

  1. jest to prosty znacznik, a często tak samo kompaktowy, a właściwie bardziej kompaktowy niż JSON.
  2. jest mniej podatny na błędy, ponieważ wszystko, co dostajesz, to znaczniki i brak kodu.
  3. w większości przypadków program będzie szybszy, ponieważ nie będziesz musiał pisać kodu osobno dla klienta.

Po której jesteś stronie i dlaczego?

Author: Cyril Gupta, 2009-08-16

13 answers

Jestem trochę po obu stronach, właściwie:

  • Gdy to, czego potrzebuję po stronie javascript, to Dane , używam JSON
  • gdy po stronie javascript potrzebuję prezentacji na której Nie będę robił żadnych obliczeń, zazwyczaj używam HTML

Główną zaletą korzystania z HTML jest to, gdy chcesz zastąpić pełną część strony tym, co pochodzi z żądania Ajax:

  • przebudowa części strony w JS jest (całkiem) hard
  • prawdopodobnie masz już jakiś silnik szablonów po stronie serwera, który został użyty do wygenerowania strony... Dlaczego nie użyć go ponownie ?

Ogólnie nie biorę pod uwagę strony "wydajności", przynajmniej na serwerze:

  • na serwerze, generowanie części HTML lub jakiegoś JSONA prawdopodobnie nie zrobi takiej różnicy
  • o wielkości rzeczy, które przechodzą przez sieć: cóż, prawdopodobnie nie używaj setek KB danych / html... Korzystanie z gzip na cokolwiek przesyłasz jest tym, co zrobi największą różnicę (nie wybierając pomiędzy HTML i JSON)
  • jedną z rzeczy, które można wziąć pod uwagę, jest to, jakie zasoby będą potrzebne klientowi, aby odtworzyć HTML (lub strukturę DOM) z danych JSON... porównaj to z wpychaniem części HTML na stronę; -)

Wreszcie, jedna rzecz, która zdecydowanie ma znaczenie :

  • Jak długo zajmie ci opracowanie nowego systemu, który będzie wysyłał dane w postaci JSON + kod JS wymagany do wprowadzenia go jako HTML na stronę ?
  • Jak długo zajmie zwrócenie HTML ? A jak długo, jeśli możesz ponownie wykorzystać część już istniejącego kodu po stronie serwera ?


I odpowiedzieć na inną odpowiedź : jeśli chcesz zaktualizować więcej niż jedną część strony, nadal istnieje rozwiązanie / hack wysyłania wszystkich tych części wewnątrz jednego dużego ciągu, który grupuje kilka części HTML i wyodrębnić odpowiednie części w JS.

Na przykład, możesz zwrócić łańcuch, który wygląda tak:

<!-- 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 -->

To nie wygląda zbyt dobrze, ale jest zdecydowanie przydatne (używałem go już kilka razy, głównie wtedy, gdy dane HTML były zbyt duże, aby można je było zamknąć w JSON) : wysyłasz HTML dla części strony, które wymagają prezentacji, i wysyłasz JSON dla sytuacji, w której potrzebujesz danych...

... I wydobyć te, metoda js substring załatwi sprawę, jak sądzę; -)

 241
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-16 14:21:11

Zgadzam się głównie z opiniami tutaj przedstawionymi. Chciałem je tylko podsumować jako:

  • To jest zła praktyka, aby wysłać HTML, jeśli kończy się parsowanie go po stronie klienta, aby wykonać kilka obliczeń na nim.

  • Wysyłanie JSON jest złą praktyką, jeśli wszystko, co zrobisz, to włączenie go do drzewa DOM strony.

 107
Author: Vinko Vrsalovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-16 14:18:50

Cóż,

Jestem jedną z tych rzadkich osób, które lubią rozdzielać rzeczy w ten sposób: - Serwer jest odpowiedzialny za dostarczanie danych (model); - Klient jest odpowiedzialny za wyświetlanie (widok) i manipulowanie danymi (model);

Więc serwer powinien skupić się na dostarczaniu modelu (w tym przypadku JSON jest lepszy). W ten sposób uzyskasz elastyczne podejście. Jeśli chcesz zmienić widok twojego modelu, zachowaj serwer wysyłający te same dane i po prostu zmień klienta, komponenty javascript, które zmieniają te dane w widok. Wyobraź sobie, że masz serwer dostarczający dane do urządzeń mobilnych, a także aplikacji desktopowych.

Również takie podejście zwiększa produktywność, ponieważ serwer i Kod klienta mogą być budowane w tym samym czasie, nigdy nie tracąc ostrości, co dzieje się, gdy ciągle przełączasz się z js na PHP / JAVA / itp.

Ogólnie myślę, że większość ludzi woli robić jak najwięcej po stronie serwera, ponieważ nie opanowują js, więc starają się go unikać tak bardzo, jak możliwe.

Zasadniczo mam to samo zdanie co ci kolesie, którzy pracują nad Angular. Moim zdaniem taka jest przyszłość aplikacji internetowych.

 25
Author: user1769128,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-13 16:48:06

Mam coś ciekawego, co mógłbym dodać. Opracowałem aplikację, która tylko raz załadowała pełny widok. Od tego momentu komunikował się z powrotem do serwera tylko za pomocą ajax. Trzeba było tylko załadować jedną stronę (mój powód jest tutaj nieistotny). Interesująca część polega na tym, że miałem specjalną potrzebę zwrócenia niektórych danych do obsługi w javascript i częściowego widoku do wyświetlenia. Mogłem podzielić to na dwa wezwania do dwóch oddzielnych działań metody, ale postanowiłem wybrać coś bardziej zabawnego.

Zobacz:

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

Co to jest RenderPartialViewToString ()? To jest ten mały samorodek chłodu tutaj:

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();
     }
}

Nie zrobiłem żadnych testów wydajności na tym, więc nie jestem pewien, czy wiąże się to więcej lub mniej narzutów niż wywołanie jednej metody akcji dla JsonResult i jednej dla ParticalViewResult, ale nadal myślałem, że to było całkiem fajne. Po prostu serializuje częściowy widok na ciąg znaków i wysyła go wraz z Json jako jeden z jego parametrów. Następnie używam JQuery, aby wziąć ten parametr i wsadzić go do odpowiedniego węzła DOM:)

Daj mi znać, co myślisz o mojej hybrydzie!
 9
Author: Chev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-07 07:24:45

Jeśli odpowiedź nie wymaga dalszego przetwarzania po stronie klienta, HTML jest moim zdaniem OK. Wysłanie JSON zmusi cię tylko do tego przetwarzania po stronie klienta.

Z drugiej strony, używam JSON, gdy nie chcę używać wszystkich danych odpowiedzi na raz. Na przykład, mam serię trzech połączonych selektów, gdzie wybrana wartość jednego określa, które wartości będą używane do wypełnienia drugiego, i tak dalej.

 8
Author: Ionuț G. Stan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-16 14:12:54

IMV, chodzi o oddzielenie danych od prezentacji danych, ale jestem z Pascalem, niekoniecznie wynika to z tego, że oddzielenie może być tylko przez granicę klient / serwer. Jeśli masz już tę separację (na serwerze) i po prostu chcesz pokazać coś klientowi, to czy odeślesz JSON i przetworzysz go na kliencie, czy po prostu odeślesz HTML, zależy całkowicie od twoich potrzeb. Powiedzieć, że" mylisz się " wysyłając HTML w ogólnym przypadku jest zbyt / align= "left" /

 7
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-18 16:33:27

JSON jest bardzo wszechstronny i lekki format. Odkryłem jego piękno, gdy zacząłem używać go jako parsera szablonów po stronie klienta. Pozwól, że wyjaśnię, podczas gdy wcześniej używałem smarty i widoki po stronie serwera (generowanie wysokiego obciążenia serwera), teraz używam niektórych niestandardowych funkcji jquery i wszystkie dane są renderowane po stronie klienta, za pomocą przeglądarki klientów jako parser szablonów. oszczędza zasoby serwerów, a z drugiej strony przeglądarki codziennie poprawiają swoje silniki JS. Tak więc szybkość klienta parsowanie nie jest teraz ważnym problemem, co więcej, obiekty JSON są zwykle bardzo małe, więc nie zużywają zbyt wielu zasobów po stronie klienta. Wolę mieć powolną stronę dla niektórych użytkowników z powolną przeglądarką, niż powolną stronę dla wszystkich z powodu bardzo załadowanego serwera.

Z drugiej strony wysyłając czyste dane z serwera wyodrębniasz je z prezentacji, więc jeśli jutro chcesz je zmienić lub zintegrować swoje dane z inną usługą możesz to zrobić znacznie łatwiej.

Just my 2 centy.

 6
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-30 11:47:09

Jeśli chcesz mieć czystego klienta odsprzęgniętego, co moim zdaniem jest najlepszą praktyką, to warto mieć 100% DOM stworzony przez javascript. Jeśli zbudujesz klienta opartego na MVC, który ma całą wiedzę, jak zbudować interfejs użytkownika, Twoi użytkownicy pobierają jeden plik javascript jeden raz i jest buforowany na kliencie. Wszystkie żądania po tym początkowym załadowaniu są oparte na Ajax i zwracają tylko dane. Takie podejście jest najczystsze, jakie znalazłem i zapewnia czystą, niezależną hermetyzację prezentacja.

Strona serwera skupia się wtedy na dostarczaniu danych.

Więc jutro, gdy produkt poprosi Cię o zmianę projektu strony całkowicie zmienisz tylko źródło JS, które tworzy DOM, ale prawdopodobnie ponownie wykorzystasz już istniejące procedury obsługi zdarzeń, a serwer jest nieświadomy, ponieważ w 100% odsprzęgnięty od prezentacji

 6
Author: Lance Caraccioli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 22:55:54

W zależności od interfejsu użytkownika może być konieczne zaktualizowanie dwóch (lub więcej) różnych elementów w DOM. Jeśli Twoja odpowiedź jest w HTML, czy zamierzasz ją przeanalizować, aby dowiedzieć się, co idzie gdzie? Możesz też użyć JSON hash.

Można go nawet połączyć, zwracając dane JSON w / html:)

{ 'dom_ele_1' : '<p>My HTML part 1</p>', 'dome_ele_2' : '<div>Your payment has been received</div>' }
 4
Author: tchen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-16 14:22:22

HTML posiada wiele zbędnych i nie wyświetlanych danych tj. znaczniki, arkusze stylów itp.. Tak więc rozmiar HTML w porównaniu do danych JSON będzie większy, co spowoduje więcej czasu pobierania i renderowania, a także spowoduje, że przeglądarka będzie zajęta renderowaniem nowych danych.

 2
Author: John Saman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-20 07:10:49

Wysyłanie json jest zazwyczaj wykonywane, gdy masz widżet javascript żądający informacji z serwera, takich jak lista, widok drzewa lub autouzupełnianie. To jest, kiedy chciałbym wysłać JSON, ponieważ są to dane, które będą przetwarzane i używane raw. Jednak jeśli po prostu pokaż HTML to jego o wiele mniej pracy, aby wygenerować go po stronie serwera i po prostu pokazać go w przeglądarce. Przeglądarki są zoptymalizowane do wstawiania HTML bezpośrednio do dom za pomocą innerHTML="", więc nie możesz się z tym pomylić.

 1
Author: Zoidberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-17 13:10:35

Myślę, że to zależy od struktury projektu, po prostu bardziej seksowne jest używanie JSON niż HTML, ale pytanie brzmi, jak sobie z tym poradzić, aby można było go łatwo utrzymać.

Na przykład, powiedzmy, że mam stronę z listą, która wykorzystuje ten sam html / styl całej witryny, napiszę globalną funkcję do formatowania tych części HTML i wszystko, co muszę zrobić, to przekazać obiekt JSON do funkcji.

 0
Author: Methee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-11 15:34:37

Odpowiedź Html jest wystarczająca w większości przypadków, chyba że trzeba wykonać jakieś obliczenia po stronie klienta.

 0
Author: mubashir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-13 09:16:33