我的HTML代码包含多个input
,名称相同:
<input type="hidden" value="42" name="authors" />
<input type="hidden" value="13" name="authors" />
<input type="hidden" value="33" name="authors" />
值的顺序很重要。 HTML规范是否定义用户代理必须保留此订单,如果是,那么常见(市场份额> 1%)浏览器是否遵循此定义?
如果有人知道WSGI,尤其是Django是否保留了服务器端的订单,那么奖励积分: - )
谢谢!
答案 0 :(得分:35)
是的,它们应按照html rfc
按照它们出现的顺序发送见8.2.1。 form-urlencoded媒体类型:
字段按照它们在文档中出现的顺序列出 名称与
=
的值分隔 并且每对分开 其他人&
。具有空值的字段 可以省略。特别是, 未选中的单选按钮和 复选框不应出现在 编码数据,但隐藏字段 存在的VALUE属性应该。
我也在html 4.0的规范中找到了:
对于网址编码数据:
控件名称/值列在 它们出现在文档中的顺序。 名称与值分开 由
=
和名称/值对组成 由&
分开。
对于多部分数据(感谢@Chuck):
“multipart / form-data”消息 包含一系列部分,每个部分 代表一个成功的控制。该 零件被发送到处理代理 以相同的顺序对应 控件出现在文档中 流。部分边界不应该 发生在任何数据中;这是怎么回事 完成的事情超出了这个范围 说明书
答案 1 :(得分:2)
application/x-www-form-urlencoded
和text/plain
的{{3}}列出了“对于表单数据集中的每个条目[...]附加”的算法,导致相同的顺序。
至于multipart/form-data
:“部分的顺序必须与表单数据集中的字段顺序相同。具有相同名称的多个条目必须被视为不同的字段。”
如果没有获得从文档派生的表单数据集的顺序,这将是不完整的:相同的规范定义了HTML5 spec的算法“循环:对于控件中的每个元素字段,在树中订购,运行以下子步骤,只跳过或追加一个条目。
因此,对于符合HTML5的用户代理,无论编码如何,非跳过参数都是按树排序的,并且允许重复。