这个Ruby参数约定来自哪里?

Ada*_*sek 7 ruby middleware conventions query-parameters

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
Run Code Online (Sandbox Code Playgroud)

他们被解析为:

{
  :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 ]
  }
}
Run Code Online (Sandbox Code Playgroud)

我相信PHP也支持这一点.任何人都可以告诉我这个约定叫什么,它来自哪里,以及其他语言支持它?(Perl,Python等)

rdv*_*ijk 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_handler,在PHP标准POST处理程序.

蟒蛇

在Python中,默认情况下不支持此格式.有关主题,请参阅stackoverflow.com上的此问题.

Perl的

CGIPerl中的库也不支持这种格式.它确实可以轻松访问单个或多个值,但不能像示例中那样访问嵌套值.查看文档feching一个命名参数的值或值获取的参数列表作为哈希.

Java的

检查出的查询参数解析的对象激烈争论这个问题.默认情况下,Java不会将POST参数的这种"嵌套格式"解析为数据结构.

结论

我已经研究了这个,并没有找到这种参数解析方式的单一名称.在我研究过的语言中,只有Ruby和PHP本身支持这种格式.