Javascript 如何在HTTP POST请求中处理2D数组
我有一个如下的HTML表单,它使用2D数组来存储输入元素Javascript 如何在HTTP POST请求中处理2D数组,javascript,html,arrays,post,multidimensional-array,Javascript,Html,Arrays,Post,Multidimensional Array,我有一个如下的HTML表单,它使用2D数组来存储输入元素 我想知道HTTP请求中会传递多少个参数,是一个还是六个。如何编写表单,以便将上述6个键值对作为一个参数传递 谢谢你的投入 编辑:看起来下面的请求在请求中发送了6个参数,我怎么能只为下面的表单发送参数 <form action="/myAction" method="post"> <input type="text" name="myList[]" value="John" /> <input ty
我想知道HTTP请求中会传递多少个参数,是一个还是六个。如何编写表单,以便将上述6个键值对作为一个参数传递
谢谢你的投入
编辑:看起来下面的请求在请求中发送了6个参数,我怎么能只为下面的表单发送参数
<form action="/myAction" method="post">
<input type="text" name="myList[]" value="John" />
<input type="text" name="myList[]" value="Peter" />
<input type="text" name="myList[]" value="Mike" />
<input type="text" name="myList[]" value="Neo" />
<input type="text" name="myList[]" value="Stella" />
<input type="text" name="myList[]" value="Eve" />
<input type="submit" value="submit" />
</form>
响应如下所示
Array
(
[myList] => Array
(
[1] => Array
(
[NAME] => John
[AGE] => 20
)
[2] => Array
(
[NAME] => Mike
[AGE] => 30
)
[3] => Array
(
[NAME] => Sam
[AGE] => 40
)
)
)
编辑:为了更具体地回答您的问题,响应中将只有一个参数,但该参数将是一个数组。数组的每个元素都是一个数组本身(请注意,这是一个数组数组,从技术上讲不是2D数组,这不完全是一回事)
一般来说,您的模型很好,这些数据在服务器端很容易处理。默认情况下,表单将与
应用程序/x-www-form-urlencoded
内容类型一起提交,因此您的数据将按照规则进行URI编码
编码:
myList%5B%5D=John&myList%5B%5D=Peter&myList%5B%5D=Mike&myList%5B%5D=Neo&myList%5B%5D=Stella&myList%5B%5D=Eve
解码:
myList[]=约翰和myList[]=彼得和myList[]=迈克和myList[]=尼奥和myList[]=斯特拉和myList[]=伊芙
如果您只想提交一个参数,您应该在客户端对数据进行编码,例如,您可以用逗号分隔所有值
下面是一个工作示例(使用jQuery):
这实际上是一个非常有用的特性。如果仔细观察,您会发现它实际上非常接近于PHP中数组的操作方式
<input type="text" name="myList[]" value="John" />
<input type="text" name="myList[]" value="Peter" />
<input type="text" name="myList[]" value="Mike" />
例如,它的设计使您可以轻松地使用输入的name
属性创建PHP数组
<input type="text" name="myList[user][100505][name]" value="John" />
要让PHP模块填充$\u POST
数组,您需要发送两个内容类型
标题之一:应用程序/x-www-form-urlencoded
或多部分/表单数据;boundary-…
这是您的浏览器自动执行的操作。如果注意请求主体,您会注意到参数的定义与输入字段的命名完全相同,这意味着它们将以完全相同的顺序使用相同的值进行解析
考虑以下示例:
<input type="text" name="myList[]" value="John" />
<input type="text" name="myList[]" value="Peter" />
<input type="text" name="myList[]" value="Mike" />
但是,这将导致一个包含3个元素的数组
<input type="text" name="myList[1]" value="John" />
<input type="text" name="myList[1]" value="Peter" />
<input type="text" name="myList[1]" value="Mike" />
这将产生一个只有一个元素的数组,该元素将是Mike
,因为参数是按照提供的顺序解析的,并且由于它们都具有相同的键,最后一个将是您得到的。另外,不要被愚弄,你只得到一个元素,所有元素都被请求携带并传递到服务器,即使你有1000个输入,你仍然会在你的$\u POST['myList']
中得到一个元素,但所有1000个元素都会被解析
您可以继续使用任意多个级别,但请记住,这样做时,如果有大量此类输入和大量数组级别,则可能会显著增加请求大小。还请注意,从PHP 7.0(尚未发布)开始,出于安全目的,参数数量将限制在1000个,即DoS攻击,利用此弱点发送大量参数,服务器将尝试解析这些参数,消耗资源。HTTP参数中数组的使用特定于客户端和/或服务器端实现。HTTP协议中没有数组(包括POST和GET),甚至没有键/值格式(请参阅) 键/值标准是通过使用
定义的。当方法为POST时,HTTP查询体包含类型为的“某些数据”
在第一个示例中,HTML将为每个输入
字段设置一个键/值对
[
和]
字符只是HTTP协议视图中的随机字节,只是HTML键/名称的一部分
HTTP查询如下所示:
[...]
Content-Type: application/x-www-form-urlencoded
myList%5B1%5D%5BNAME%5D=John&myList%5B1%5D%5BAGE%5D=20&myList%5B2%5D%5BNAME%5D=Mike&myList%5B2%5D%5BAGE%5D=30&myList%5B3%5D%5BNAME%5D=Sam&myList%5B3%5D%5BAGE%5D=40
现在的问题是:
我想知道HTTP请求将传递多少个参数
HTTP请求中始终有一个(或无)查询字符串和一个(或无)正文。所以,这个问题本身并没有真正意义。如果更多的是关于HTML,那么答案是6。
一个输入字段=一个键/值对=一个特定信息。要获得多个信息,需要多个输入字段
我假设您使用的是PHP,它解析[
和]
字符,因此从PHP的角度来看,您将得到以下结构:
Array
(
[myList] => Array
(
[1] => Array
(
[NAME] => John
[AGE] => 20
)
[2] => Array
(
[NAME] => Mike
[AGE] => 30
)
[3] => Array
(
[NAME] => Sam
[AGE] => 40
)
)
)
关于另一个问题:
我怎样才能只发送以下表格的参数
<form action="/myAction" method="post">
<input type="text" name="myList[]" value="John" />
<input type="text" name="myList[]" value="Peter" />
<input type="text" name="myList[]" value="Mike" />
<input type="text" name="myList[]" value="Neo" />
<input type="text" name="myList[]" value="Stella" />
<input type="text" name="myList[]" value="Eve" />
<input type="submit" value="submit" />
</form>
六个输入=六个信息=六个键/值。但是PHP将为您提供一个包含六个值的数组。
或者你只需要一个
如果您没有使用PHP,那么它是特定于您所使用的语言的,因此,请澄清这个问题。更好的做法是将数组设置为JSON对象并传递它。我想知道HTTP请求中将传递多少个参数:查看开发人员工具的“网络”选项卡或使用类似的代理,这都是关于接收语言如何解析post数据的。您使用的是哪种语言或http服务器库?谢谢您的回复,您能告诉我如何在客户端编码数据吗?当我尝试join()或toString()时,如何将myList转换为CSV?它将字符串化整个输入元素,而我只希望值在那里。谢谢,我也找到了解决方法。很高兴听到这个消息!顺便问一下,你的解决办法是什么?:)@unixarmy在
arr.slice(',')
上使用.slice(',')的目的是什么?@guest271314,很好!我更新了代码,arr.join(',')
是应该使用的正确方法
[...]
Content-Type: application/x-www-form-urlencoded
myList%5B1%5D%5BNAME%5D=John&myList%5B1%5D%5BAGE%5D=20&myList%5B2%5D%5BNAME%5D=Mike&myList%5B2%5D%5BAGE%5D=30&myList%5B3%5D%5BNAME%5D=Sam&myList%5B3%5D%5BAGE%5D=40
Array
(
[myList] => Array
(
[1] => Array
(
[NAME] => John
[AGE] => 20
)
[2] => Array
(
[NAME] => Mike
[AGE] => 30
)
[3] => Array
(
[NAME] => Sam
[AGE] => 40
)
)
)
<form action="/myAction" method="post">
<input type="text" name="myList[]" value="John" />
<input type="text" name="myList[]" value="Peter" />
<input type="text" name="myList[]" value="Mike" />
<input type="text" name="myList[]" value="Neo" />
<input type="text" name="myList[]" value="Stella" />
<input type="text" name="myList[]" value="Eve" />
<input type="submit" value="submit" />
</form>