我看到了在客户端获取 JSON 响应和格式化的优势,但是与普通提交相比,使用 JSON 进行表单提交有什么优势吗?
5 回答
处理 POST 数据时想到的一件事是无用的重复:
例如,在 POST 中,我们有这个:
partners[]=Apple&partners[]=Microsoft&partners[]=Activision
我们实际上可以看到,这里有很多重复,就像我们发送 JSON 时一样:
{"partners":["Apple","Microsoft","Activision"]}
59 个字符与 47 个字符。在这个小示例中,它看起来微不足道,但这些节省可能会越来越多,甚至几个字节也会为您节省一些数据。当然,在服务器端解析数据,这可以消除差异,但我仍然看到这在处理较慢的连接时有时会有所帮助(看看你,3G 和 EDGE)。
我没有看到任何关于文件提交的提及,所以我想我会插话。FormData 似乎是通过 AJAX 向服务器提交文件的标准方式。我没有遇到任何使用 JSON 的解决方案,但可能有一种方法可以序列化/反序列化文件......
这可能取决于您的服务器端应用程序。您通常使用 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数据。
希望我回答了你的问题。
我没有看到基本表单提交有任何明显的优势。但是在处理复杂结构时,您将开始意识到组织数据的优势。
因此,如果您有一个简单的联系表格(姓名、电子邮件、消息),请坚持使用普通表格POST
。但是考虑提交一个完整的用户简历,在你的服务器端脚本中处理大量的变量是非常烦人的。
这是一个将 JSON 与 PHP 结合使用的示例
//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 可以让您更轻松地处理数据。
我实际上正在努力解决同样的问题。我的用例要求将潜在的复杂树发布到服务器。一些框架能够将二维数组解码为表单属性(Spring WebMVC 是我所知道的)。即便如此,这仅在您发送嵌套数组时的特定情况下对您有所帮助。名称-值-对的固有性质使其不适合传输超过一层深度的树。过去,我使用过一些技巧,例如将 URL 编码的 JSON 作为属性值发送:
val0=%7B%22name%22%3A%22value%22%7D&val1=something&val2=something+else
但是,当对象变得更复杂时,这种方法会变得混乱且难以调试。此外,许多框架提供了自动将 JSON 表单 post 映射到对象的工具(例如:Jackson for Java),不利用这些工具似乎很迟钝。
所以最终,选择取决于您发送的对象的复杂性。如果对象仅限于一级深度,则使用直接名称-值-对;如果对象很复杂并且涉及深度嵌套的树,请使用 JSON。