【问题标题】:Is there a spec for nested urlencoded params[]?是否有嵌套 urlencoded 参数 [] 的规范?
【发布时间】:2015-05-15 14:04:38
【问题描述】:

在历史上的某一时刻,服务器端语言开始调整 urlencoded 参数以添加对作为数组和键/值对象提交数据的支持:

// key/value pairs
contact[name]=John
contact[phone]=800-555-1234

// arrays
foo[]=bar
foo[]=baz

我在一个库的嵌套参数解析中处理一些边缘情况,例如参数顺序的保留。是否有规范服务器应如何处理此编码的规范?如果没有,哪个参考实现引入了这种语法?

【问题讨论】:

标签: http uri url-encoding


【解决方案1】:

URI 中的方括号

根据RFC-3986 "Uniform Resource Identifier (URI): Generic Syntax",不允许在 URI 中使用未编码的方括号。因此它不是 HTTP 标准。

由 Internet 协议文字地址(版本 6 [RFC3513] 或更高版本)标识的主机通过将 IP 文字括在方括号(“[”和“]”)中来区分。这是 URI 语法中唯一允许使用方括号字符的地方。

许多编程语言都在数组中使用方括号,因此我猜想在 URI 中使用方括号是很自然的做法。

是否有规范服务器应如何处理此编码的规范?

不,至少不是语言独立的。

首次实施

许多 Web 应用程序框架允许在查询中重复使用相同的键来创建数组,例如 http://example.org/?foobar=hello&foobar=world。这些框架还允许在键中使用方括号,但这没有区别,它们只是名称的一部分。很少支持关联数组。 (警告:我不熟悉所有这些语言。)

  • Perl,1987:支持编号数组,但不支持关联数组。
  • PHP,1995:支持编号数组和关联数组。
  • Active Server Pages (ASP),1996:支持编号数组,但不支持关联数组。
  • JavaServerPages (JSP),1999:支持编号数组,但不支持关联数组。
  • JAX-RS (Java),2008:支持编号数组,但不支持关联数组。

到目前为止,PHP 是我发现的唯一一种语言,它支持 URL 中的关联数组,无需自定义代码。

【讨论】:

  • 我知道编程语言长期以来一直在其语法中使用它们,但我对它们在 URI 查询字符串中的用法很感兴趣。我需要一个可以分析其行为的规范/参考实现。
  • @BradKoch:对不起,我只写了一半的想法。我认为我们无法为您提供独立于语言的答案。您使用的是哪种服务器?
  • 我正在对 Clojure 库进行一些测试。不过这无关紧要,我正在尝试找到原始参考实现,以便了解它的行为方式。
  • @BradKoch 通过原始参考实现,您的意思是第一个实现方括号语法的服务器?不管它是用哪种语言实现的?
  • 是的,其他语言复制的第一个实现。
【解决方案2】:

http_build_query 在 PHP 中已经存在很长时间了。大概就是这样。 https://php.net/http_build_query

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 2018-05-23
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多