【问题标题】:Normal form submission vs. JSON普通表单提交与 JSON
【发布时间】:2012-08-16 01:37:15
【问题描述】:

我看到了在客户端获取 JSON 响应和格式化的优势,但与普通提交相比,使用 JSON 进行表单提交有什么优势吗?

【问题讨论】:

    标签: json post


    【解决方案1】:

    在处理 POST 数据时会想到一件事情是无用的重复:

    例如,在 POST 中我们有这样的:

    partners[]=Apple&partners[]=Microsoft&partners[]=Activision
    

    我们实际上可以看到,这里有很多重复,就像我们发送 JSON 时一样:

    {"partners":["Apple","Microsoft","Activision"]}
    

    59 个字符与 47 个字符。在这个小示例中,它看起来微不足道,但这些节省可能会越来越多,甚至几个字节也会为您节省一些数据。当然,在服务器端解析数据,这可以消除差异,但我仍然看到这在处理较慢的连接时有时会有所帮助(看看你,3G 和 EDGE)。

    【讨论】:

      【解决方案2】:

      我没有看到任何关于文件提交的提及,所以我想我会插话。FormData 似乎是通过 AJAX 向服务器提交文件的标准方式。我没有遇到任何使用 JSON 的解决方案,但可能有一种方法可以序列化/反序列化文件...

      【讨论】:

      • 好吧,您可以encode the files as Base64 并将它们作为字符串发送。它作为一个字符串比作为一个二进制文件更大,真的,但有时你需要完成的东西:)
      • 对于文件,您可能需要multipart/form-data,它支持任何编码,包括二进制。
      • 哦,对不起,我想我们说的是同一件事,是吗?
      【解决方案3】:

      我实际上正在努力解决同样的问题。我的用例要求将潜在的复杂树发布到服务器。一些框架能够将二维数组解码为表单属性(Spring WebMVC 是我所知道的)。即便如此,这仅在您发送嵌套数组时的特定情况下对您有所帮助。名称-值-对的固有性质使其不适合传输超过一层深度的树。过去,我使用过一些技巧,例如将 URL 编码的 JSON 作为属性值发送:

      val0=%7B%22name%22%3A%22value%22%7D&val1=something&val2=something+else
      

      但是,当对象变得更复杂时,这种方法会变得混乱且难以调试。此外,许多框架提供了自动将 JSON 表单 post 映射到对象的工具(例如:Jackson for Java),不利用这些工具似乎很迟钝。

      所以最终,选择取决于您发送的对象的复杂性。如果对象仅限于一级深度,则使用直接名称-值-对;如果对象很复杂并且涉及深度嵌套的树,请使用 JSON。

      【讨论】:

        【解决方案4】:

        我认为基本表单提交没有任何明显优势。但在处理复杂结构时,您将开始意识到组织数据的优势。

        因此,如果您有一个简单的联系表格(姓名、电子邮件、消息),请坚持使用普通表格 POSTing。但是以提交完整的用户简历为例,处理服务器端脚本中的大量变量非常烦人。

        这是一个在 PHP 中使用 JSON 的示例

        //Here are the submission data
        {
            "personalInformation": {
                "name": "hey",
                "age": "20"
            },
            "education": {
                "entry1": {
                    "type": "Collage",
                    "year": "2012"
                },
                "entry2": {
                    "type": "Highschool",
                    "year": "2010"
                }
            }
        }
        
        $CV_Data = json_decode($_POST['json_form'], true);
        $CV_Data['personalInformation']['name'];
        $CV_Data['personalInformation']['age'];
        //Or you can loop
        foreach($CV_Data['education'] as $entry){
           $entry['type'];
           $entry['year'];
        }
        

        如您所见,在这里使用 JSON 可以让您更轻松地处理数据。

        【讨论】:

        • 将所有表单元素映射到服务器端对象或json对象不是同样的努力吗?
        • @saintbands,真的。但是由于您的问题无法客观地回答,我试图表达自己的观点。我通常更喜欢在客户端执行这样的任务,让我在服务器端整齐地处理数据。但你是绝对正确的,没有实际收益。
        【解决方案5】:

        这可能取决于您的服务器端应用程序。您通常使用 POST 将数据发布到服务器,因此如何格式化下划线数据取决于您希望服务器如何处理它。 POST 提供了某种形式的 key->value 协议,而在 JSON 中你可以放更多。您也可以通过将 GET 放在 url 中来传输 json。

        您必须将 json 视为一种写入数据的方式,而使用 POST 的正常提交应该为您提供一种传输数据的方式(当然,您可以滥用它的 key->value 特性来排序数据)。

        在 HTTP 之上存在协议,可以帮助您定义 Web 应用程序的接口。一个很好的例子是 RESTfull http://en.wikipedia.org/wiki/Representational_state_transfer

        特别是提交表单,我没有看到任何优势,POST 最初就是为此而设计的。在某些情况下,您不仅要传输表单中的数据,还要传输一些元数据,在这种情况下,json 可能会通过以某种 json 格式编码表单数据(带有元数据)来帮助您,但最后您仍然会滥用 POST 进行传输这个json数据。

        希望我回答了你的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-16
          • 1970-01-01
          • 2016-11-08
          • 2014-07-17
          • 2020-11-10
          • 1970-01-01
          • 2020-06-23
          • 2020-06-07
          相关资源
          最近更新 更多