【问题标题】:Why is it a bad practice to return generated HTML instead of JSON? Or is it?为什么返回生成的 HTML 而不是 JSON 是一种不好的做法?或者是吗?
【发布时间】:2010-11-20 00:59:11
【问题描述】:

使用 JQuery 或任何其他类似框架从您的自定义 URL/Web 服务加载 HTML 内容非常容易。这种方法我已经用过很多次了,到现在都觉得效果很满意。

但是所有的书,所有的专家都试图让我使用 JSON 而不是生成的 HTML。它比 HTML 优越得多?

是不是快很多?
它在服务器上的负载是否要小得多?

另一方面,我有一些理由使用生成的 HTML。

  1. 它是简单的标记,通常与 JSON 一样紧凑或实际上更紧凑。
  2. 不容易出错,因为您得到的只是标记,没有代码。
  3. 在大多数情况下编程会更快,因为您不必为客户端单独编写代码。

你站在哪一边,为什么?

【问题讨论】:

  • 值得注意的是,AJAX 中的 X 是 XML,而 HTML 在某一时刻应该是 XML。这个想法是 HTML 是人类和机器可读的数据(如 JSON),而 CSS 将进行演示。在这些条件下,在 AJAX 请求中发送 HTML 不会违反“关注点分离”

标签: javascript jquery html ajax json


【解决方案1】:

其实我有点两面派:

  • 当我在 javascript 端需要的是 数据 时,我使用 JSON
  • 当我在javascript方面需要的是presentation,我不会做任何计算,我一般使用HTML

使用 HTML 的主要优点是当您想用 Ajax 请求返回的内容替换页面的整个部分时:

  • 在 JS 中重新构建页面的一部分(相当)困难
  • 您可能已经在服务器端安装了一些模板引擎,最初用于生成页面...为什么不重用它?

我通常不会真正考虑事物的“性能”方面,至少在服务器上:

  • 在服务器上,生成部分 HTML 或一些 JSON 可能不会产生太大影响
  • 关于通过网络传输的内容的大小:嗯,您可能不会使用数百 KB 的数据/html...在传输的任何内容上使用 gzip 将会产生最大的不同 (不在 HTML 和 JSON 之间选择)
  • 不过,可以考虑的一件事是,您需要在客户端上使用哪些资源来从 JSON 数据重新创建 HTML (或 DOM 结构)...比较一下将部分 HTML 推送到页面中 ;-)

最后,绝对重要的一件事:

  • 您需要多长时间才能开发出一个新系统,该系统将以 JSON 格式发送数据 + 将其作为 HTML 注入页面所需的 JS 代码?
  • 返回 HTML 需要多长时间?如果您可以重复使用一些已经存在的服务器端代码,需要多长时间?


并回答另一个答案:如果您需要更新页面的多个部分,仍然存在将所有这些部分发送到一个大字符串中的解决方案/黑客,该字符串将多个 HTML 部分分组,并在 JS 中提取相关部分。

例如,您可以返回一些如下所示的字符串:

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

这看起来不太好,但它确实很有用(我已经用过很多次了,主要是在 HTML 数据太大而无法封装到 JSON 中的时候):你正在为需要演示的页面部分发送 HTML,而您正在为需要数据的情况发送 JSON...

...为了提取这些,我想 JS 子字符串方法可以解决问题;-)

【讨论】:

  • 所有数据最终都是呈现。
  • @Cyril:嗯?我认为您是想说数据,为了有用,必须被使用并因此以某种形式呈现在某个地方,我同意。但至少要说数据呈现方式似乎是错误的。
  • 嗨,Vinko,注意到“最终”了吗?我的意思正是你的意思。只是想在这里进入可引用的报价书。哈哈!
  • 基本问题是您是否绝对、肯定、最终确定您不会将这些数据用于除 HTML 之外的任何内容。因为一旦打包成 HTML,数据将几乎无法恢复。借助 JSON,您的后端可以使用 XML、SVG、数据库引擎、跨站点 API 以及一千个其他可以接受 JSON 的前端和系统。使用 HTML,您将只能在 HTML 中使用它。
  • @SF:从服务器返回 HTML 时,我确保将生成 HTML 的代码与访问数据库的代码分开。这样我也可以轻松添加 JSON 表单。
【解决方案2】:

如果响应不需要进一步的客户端处理,我认为 HTML 是可以的。发送 JSON 只会强制您进行客户端处理。

另一方面,当我不想一次使用所有响应数据时,我会使用 JSON。例如,我有一系列三个链式选择,其中一个的选定值决定了哪些值将用于填充第二个,依此类推。

【讨论】:

    【解决方案3】:

    根据您的 UI,您可能需要更新 DOM 中的两个(或更多)不同元素。如果您的响应是 HTML 格式的,您是否要对其进行解析以找出去向的内容?或者您可以只使用 JSON 哈希。

    您甚至可以组合它,返回带有 html 数据的 JSON :)

    { 'dom_ele_1' : '<p>My HTML part 1</p>', 'dome_ele_2' : '<div>Your payment has been received</div>' }
    

    【讨论】:

    【解决方案4】:

    IMV,这完全是关于将数据与数据表示分离,但我支持 Pascal,它不一定意味着这种分离只能跨越客户端/服务器边界。如果您已经(在服务器上)进行了这种分离并且只想向客户端显示某些内容,那么无论您是发回 JSON 并在客户端上对其进行后处理,还是只发回 HTML,这完全取决于您的需求。说在一般情况下发回 HTML 是“错误的”,这太过笼统的声明 IMV。

    【讨论】:

      【解决方案5】:

      我主要同意这里所说的观点。我只是想将它们总结为:

      • 如果您最终在客户端解析 HTML 以对其进行一些计算,则发送 HTML 是一种不好的做法。

      • 如果您最终要做的只是将 JSON 合并到页面的 DOM 树中,那么发送 JSON 是一种不好的做法。

      【讨论】:

      • 如果您需要进行一些计算并将其合并到页面的 DOM 中怎么办?
      • 我想知道如果你把“Half-life of Knowledge”加到等式中,上面的陈述会有多长时间的真实性?
      • 是否可以返回一个带有
      • 这个。此外,如果您返回的数据需要以某种方式呈现流畅,例如如果您有一个 HTML 表格,其中包含您希望能够排序的列。无论您现在是否已使它们可排序,您可能希望稍后再进行排序,因此在这种情况下,为面向未来而付出额外的努力是值得的。
      • 我还要补充一点,如果您通过 JSON 请求图像 url 只是为了尝试在页面上呈现它们,那么从一开始就将它们包含在 HTML 中会更高效,这样图像就可以开始加载更早(在你的 ajax 回来之前)。
      【解决方案6】:

      当您有一个 javascript 小部件从服务器请求信息时,通常会发送 json,例如列表或树视图或自动完成。这是我发送 JSON 的时候,因为它将被解析和使用原始数据。但是,如果您只是要显示 HTML,那么在服务器端生成它并在浏览器上显示它的工作要少得多。浏览器已针对使用 innerHTML = "" 将 HTML 直接插入 dom 进行了优化,因此您不会出错。

      【讨论】:

      【解决方案7】:

      JSON 是一种非常通用且轻量级的格式。当我开始将它用作客户端模板解析器数据时,我发现了它的美妙之处。让我解释一下,在我在服务器端使用 smarty 和视图(产生高服务器负载)之前,现在我使用一些自定义 jquery 函数,所有数据都在客户端呈现,使用客户端浏览器作为模板解析器。它节省了服务器资源,另一方面,浏览器每天都在改进他们的 JS 引擎。所以客户端解析的速度现在不是一个重要的问题,更重要的是,JSON对象通常很小,所以它们不会消耗大量的客户端资源。我更喜欢为一些浏览器速度较慢的用户提供一个速度较慢的网站,而不是因为服务器负载过重而为每个人提供速度较慢的网站。

      另一方面,从服务器发送纯数据是您将其从表示中抽象出来,因此,如果明天您想更改它或将您的数据集成到另一个服务中,您可以更轻松地做到这一点。

      只要我的 2 美分。

      【讨论】:

      • 在禁用 javascript 时如何确保获得可读页面?
      • 如果 JS 被禁用,您也将无法加载 html。根据我的 Google Analytics 统计数据,2.3% 的用户禁用了 JS。最好的堕落方式是尝试取悦所有人。
      • 我 100% 同意迈克。试图取悦所有人是不可能的,只会伤害你。如果用户关闭了 JS,那么他们现在必须习惯许多不适合他们的网站。
      • 由于 Google Analytics(分析)使用 Javascript 跟踪数据,您如何在 Google Analytics(分析)中获取 JavaScript 统计信息?
      • @Nick 好问题,但我发现了这个:stackoverflow.com/questions/15265883/…
      【解决方案8】:

      我认为这取决于设计的结构,使用 JSON 比使用 HTML 更性感,但问题是如何处理它以便易于维护。

      例如,假设我的列表页面使用整个站点的相同 html/样式,我将编写全局函数来格式化 HTML 的这些部分,我所要做的就是将 JSON 对象传递给函数.

      【讨论】:

        【解决方案9】:

        我想补充一些有趣的东西。我开发了一个只加载一次完整视图的应用程序。从那时起,它仅使用 ajax 与服务器通信。它只需要加载一页(我这样做的原因在这里并不重要)。有趣的是,我特别需要返回一些要在 javascript 中操作的数据和要显示的部分视图。我本可以将其拆分为对两个单独操作方法的两次调用,但我决定使用更有趣的方法。

        检查一下:

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

        您可能会问什么是 RenderPartialViewToString()?就是这里的这小块凉爽:

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

        我还没有对此进行任何性能测试,所以我不确定它是否会比为 JsonResult 调用一个操作方法和为 ParticalViewResult 调用一个操作方法产生更多或更少的开销,但我仍然认为它非常酷。它只是将部分视图序列化为字符串并将其与 Json 一起作为其参数之一发送。然后我使用 JQuery 获取该参数并将其放入适当的 DOM 节点:)

        让我知道你对我的混血儿的看法!

        【讨论】:

        • 在一个请求中发送渲染视图和数据似乎有点多余。开个玩笑,如果您有能力进行客户端视图渲染,那么将视图模板和数据作为单独的请求发送会更好。它需要一个额外的请求,但只需要一次,因为模板请求将被缓存以供后续请求使用。理想情况下,最好结合使用客户端和服务器端视图渲染,这样您就可以在服务器上构建页面并在浏览器中构建部分页面,但如果您只实现服务器端视图渲染,这不是一个坏方法。
        【解决方案10】:

        嗯,

        我是少数喜欢以这种方式分开事物的人之一: - 服务器负责传递数据(模型); - 客户端负责显示(视图)和操作数据(模型);

        因此,服务器应该专注于交付模型(在这种情况下 JSON 更好)。 这样,您将获得一种灵活的方法。如果你想改变你的模型的视图,你保持服务器发送相同的数据,只改变客户端,javascript组件,将数据更改为视图。想象一下,您有一台服务器将数据传输到移动设备和桌面应用程序。

        此外,这种方法提高了生产力,因为服务器和客户端代码可以同时构建,永远不会失去焦点,当你不断从 js 切换到 PHP / JAVA / 等时会发生这种情况。

        一般来说,我觉得大部分人更喜欢在服务端尽量多做,因为他们不精通js,所以尽量避免。

        基本上,我和那些从事 Angular 工作的人有相同的看法。在我看来,这就是网络应用的未来。

        【讨论】:

        • 是的,我完全同意你的看法。但是,当涉及敏感信息时,我认为最好在服务器端做尽可能多的事情。如果您需要客户端根据结果做出不同的反应,我会使用 json,否则我会使用 html。
        • 现在是 2021 年,是的,每个人都在切换到或至少关注有关这些新 JS 框架(Svelte/Vue/React/等)的新闻。不错的预测;)
        【解决方案11】:

        在大多数情况下,HTML 响应就足够了,除非您必须在客户端执行一些计算。

        【讨论】:

          【解决方案12】:

          如果您想要一个干净的解耦客户端,我认为这是最佳实践,那么让 100% 的 DOM 由 javascript 创建是有意义的。如果您构建了一个基于 MVC 的客户端,该客户端具有构建 UI 的所有知识,那么您的用户一次下载一个 javascript 文件并将其缓存在客户端上。初始加载之后的所有请求都是基于 Ajax 的,并且只返回数据。这种方法是我发现的最干净的方法,并且提供了对演示文稿的干净独立的封装。

          然后服务器端只专注于传递数据。

          所以明天当产品要求你完全改变页面的设计时,你所改变的只是创建 DOM 的源 JS,但可能会重用你已经存在的事件处理程序,而服务器却没有注意到,因为它 100% 与演示文稿

          【讨论】:

          • 我同意,您也可以将 json 用于您的移动应用程序。
          • 这应该是公认的答案 - 前 6 - 7 个单词简洁地回答了问题。
          • 同意。返回数据 (JSON) 相对于演示文稿(html) 的优势在于,您现在拥有一个“免费”的 Web API,可以重复用于其他客户端,无论是移动客户端还是对来自该应用程序的某些数据感兴趣的完全不同的应用程序等等。根据我的经验,在服务器端使用一个简单的 web 框架,它只处理数据而不是演示,通常会产生好的和简单的结果。现代浏览器和 CPU 是如此之快,以至于只有在特殊情况下,渲染才会成为瓶颈。最大的瓶颈主要是网络本身和数据库调用。
          【解决方案13】:

          HTML 有许多冗余且未显示的数据,即标签、样式表等。 因此,与 JSON 数据相比,HTML 的大小会更大,从而导致更多的下载和渲染时间,也会导致浏览器忙于渲染新数据。

          【讨论】:

            【解决方案14】:

            视情况而定。

            有时必须避免使用 JSON。 例如,当我们的程序员在 js 编程中遇到问题时。

            我的经验告诉我:最好使用 ajax 服务而不是内联 JSON。

            js迟早会出问题

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-07-08
              • 1970-01-01
              • 1970-01-01
              • 2023-01-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多