Откуда взялось это соглашение о параметрах Ruby?

Есть часть промежуточного программного обеспечения Ruby, используемого Rails и другими фреймворками для синтаксического анализа параметров, которые вы отправили на сервер, во вложенный объект Hash.

Если вы отправите эти параметры на сервер:

person[id] = 1
person[name] = Joe Blow
person[email] = [email protected]
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 => "[email protected]",
    :address => {
      :street_address => "123 Somewhere St.",
      :city => "Chicago",
      :state => "IL",
      :zip => "12345"
    },
    :other_field => [ 1, 2, 3 ]
  }
}

Я считаю, что это также поддерживается PHP. Может ли кто-нибудь сказать мне, как называется это соглашение, откуда оно взялось и какие другие языки его поддерживают? (Perl, Python и т. Д.)


person Adam Lassek    schedule 28.09.2011    source источник
comment
Я всегда думал, что синтаксис хеширования в Ruby основан на Python.   -  person Zabba    schedule 01.10.2011
comment
@Zabba, возможно, знаете ли вы какие-нибудь свидетельства того, когда он был добавлен в Python? Отчасти проблема в том, что я понятия не имею, какие поисковые запросы использовать для этого.   -  person Adam Lassek    schedule 01.10.2011


Ответы (3)


Полевые исследования

Я пытаюсь выяснить, есть ли у этого соглашения название, но пока не могу его найти.

Рубин

Как бы то ни было, промежуточное ПО, которое делает это в Ruby, - это Rack::Utils. См. исходный код на Github.

Дополнительную информацию по этому вопросу можно найти в Руководствах по Ruby on Rails .

А вот интересный билет о коде, перемещаемом из Rails в промежуточное программное обеспечение Rack.

PHP

Я покопался в исходном коде PHP, и кажется, что вся магия там происходит в main/php_variables.c исходном файле. Код SAPI вызывает метод php_std_post_handler, определенный здесь. В конечном итоге это вызывает метод php_register_variable_ex, который представляет собой 185 строк сложного синтаксического анализа строк в C (я должен признать, что C не моя сильная сторона).

Единственное имя, которое я смог найти здесь, было php_std_post_handler, стандартный обработчик POST PHP.

Python

В Python этот формат по умолчанию не поддерживается. См. этот вопрос здесь, на stackoverflow.com на сайте предмет.

Perl

Библиотека CGI в Perl также не поддерживает этот формат. Это дает легкий доступ к одному или нескольким значениям, но не к вложенным значениям, как в вашем примере. См. Документацию по получение значения или значений одного именованного параметра и получение списка параметров в виде хэша.

Ява

Посмотрите горячие дебаты по вопросу синтаксического анализа параметров запроса в этом вопросе. По умолчанию Java не анализирует этот «вложенный формат» параметров POST в структуру данных.

Вывод

Я изучил это и не нашел ни единого названия для этого способа разбора параметров. Из языков, которые я изучал, только Ruby и PHP изначально поддерживают этот формат.

person rdvdijk    schedule 01.10.2011
comment
Хм, одна из коммитов в этом тикете называет это вложенным запросом, но все, что я получаю от Google, - это SQL. - person Adam Lassek; 01.10.2011
comment
Нет вложенного формата параметров POST - есть только параметры POST. Любое вложение обрабатывается любым используемым языком / фреймворком. Параметры POST - это строки с именем; вложение - это конструкция, наложенная поверх этого. - person Dave Newton; 02.10.2011
comment
@DaveNewton: очень верно. Перефразирую предложение. Однако исходный вопрос заключается в том, чтобы спросить, какие языки также анализируют параметры, как это делают Ruby и PHP. Вложенный формат существует, по крайней мере, на этих языках. - person rdvdijk; 02.10.2011
comment
Что ж, я сомневаюсь, что когда-нибудь получу лучший ответ, чем этот. Спасибо за полевые исследования! - person Adam Lassek; 06.10.2011

Это не называется ничем, AFAIK, кроме «отправки параметров». Во всяком случае, это называется «преобразование параметра [типа]», где Rails просто «преобразует» его в хеш.

Другие платформы идут дальше, используя имена параметров в качестве выражений, используемых для создания типизированных объектов, инициализированных значениями параметров с преобразованием типа.

Все параметры представляют собой строковое значение с именем. Любая / вся структура навязывается языком / фреймворком, используемым на стороне сервера; то, во что оно преобразуется, на 100% зависит от этого языка / фреймворка, и то, из чего состоит это преобразование, будет определять, как оно будет (разумно) называться.

person Dave Newton    schedule 02.10.2011

это будет объект JSON, который в настоящее время является довольно стандартным и поддерживается большинством языков / библиотек.

person kennypu    schedule 28.09.2011
comment
Нет, это не JSON. Я говорю о параметрах запроса на стороне сервера. - person Adam Lassek; 28.09.2011