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

时间:2011-09-28 04:21:00

标签: ruby conventions middleware 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

他们被解析为:

{
  :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等)

3 个答案:

答案 0 :(得分:7)

实地研究

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

红宝石

对于它的价值,在Ruby中执行此操作的中间件是Rack::Utils。请参阅the source on Github

有关此主题的更多信息in the Ruby on Rails Guides

关于从Rails迁移到Rack中间件的代码,这里是an interesting ticket

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

在Python中,默认情况下不支持此格式。有关该主题,请参阅this question here on stackoverflow.com

的Perl

Perl中的CGI库也不支持这种格式。它确实可以轻松访问单个或多个值,但不能像示例中那样访问嵌套值。请参阅feching the value or values of a single named parameterfetching the parameter list as a hash上的文档。

爪哇

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

结论

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

这将是一个JSON对象,这是非常标准的,并且现在被大多数语言/库支持。