7

Rails 和其他框架使用一个 Ruby 中间件将您发送到服务器的参数解析为嵌套Hash对象。

如果将这些参数发送到服务器:

person[id] = 1
person[name] = Joe Blow
person[email] = joe.blow@test.com
person[address][street_address] = 123 Somewhere St.
person[address][city] = Chicago
person[address][zip] = 12345
person[other_field][] = 1
person[other_field][] = 2
person[other_field][] = 3

他们被解析为:

{
  :person => {
    :id => "1",
    :name => "Joe Blow",
    :email => "joe.blow@test.com",
    :address => {
      :street_address => "123 Somewhere St.",
      :city => "Chicago",
      :state => "IL",
      :zip => "12345"
    },
    :other_field => [ 1, 2, 3 ]
  }
}

我相信 PHP 也支持这一点。谁能告诉我这个约定叫什么,它来自哪里,还有哪些其他语言支持它?(Perl、Python 等)

4

3 回答 3

7

实地研究

我试图找出是否有这个约定的名称,但我还找不到。

红宝石

值得一提的是,在 Ruby 中执行此操作的中间件是Rack::Utils. 请参阅Github 上的源代码

Ruby on Rails 指南中提供了有关该主题的更多信息。

这里有一张关于代码从 Rails 转移到 Rack 中间件的有趣票证。

PHP

我已经在 PHP 源代码中进行了一些挖掘,似乎所有的魔法都发生在main/php_variables.c源文件中。SAPI代码调用此处定义的方法php_std_post_handler。这最终调用了该php_register_variable_ex方法,它是用 C 语言进行 185 行复杂字符串解析的方法(我必须承认 C 不是我的强项)。

我在这里能找到的唯一名称是php_std_post_handlerPHP标准 POST 处理程序

Python

在 Python 中,默认情况下不支持这种格式。在 stackoverflow.com上查看这个问题。

Perl

Perl 中的CGI库也不支持这种格式。它确实可以轻松访问单个或多个值,但不能像您的示例中那样嵌套值。请参阅有关获取单个命名参数的一个或多个值并将参数列表作为哈希获取的文档。

爪哇

查看此问题中关于查询参数解析主题的激烈辩论。默认情况下,Java 不会将这种 POST 参数的“嵌套格式”解析为数据结构。

结论

我对此进行了调查,但没有找到这种参数解析方式的单一名称。在我研究过的语言中,只有 Ruby 和 PHP 本身支持这种格式。

于 2011-10-01T14:30:22.713 回答
2

除了“发送参数”之外,它不叫任何东西,AFAIK。如果有的话,它被称为“参数 [类型] 转换”,Rails 只是将其“转换”为哈希。

其他框架走得更远,使用参数名称作为表达式,用于创建使用类型转换的参数值初始化的类型化对象。

所有参数都是带有名称的字符串值。任何/所有结构都是由服务器端使用的语言/框架强加的;它被转换成的内容 100% 取决于该语言/框架,并且该转换的组成将决定它将被(合理)称为什么。

于 2011-10-02T13:10:30.350 回答
0

那将是一个 JSON 对象,这是相当标准的,并且现在大多数语言/库都支持它。

于 2011-09-28T04:26:52.593 回答