7

サーバーに送信したパラメーターをネストされたHashオブジェクトに解析するために、Rails やその他のフレームワークで使用される Ruby ミドルウェアがあります。

これらのパラメーターをサーバーに送信する場合:

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 Guides には、この件に関する詳細情報があります。

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 では、この形式は既定ではサポートされていません。件名については、stackoverflow.com でこの質問を参照してください。

パール

PerlのCGIライブラリもこの形式をサポートしていません。単一または複数の値に簡単にアクセスできますが、例のようにネストされた値にはアクセスできません。1 つまたは複数の名前付きパラメーターの値のフェッチとパラメーター リストのハッシュとしてのフェッチに関するドキュメントを参照してください。

ジャワ

この質問で、クエリ パラメータの解析に関する激しい議論を確認してください。Java は、デフォルトでは、POST パラメータのこの「ネストされた形式」をデータ構造に解析しません。

結論

私はこれを調べましたが、この方法でパラメーターを解析するための単一の名前は見つかりませんでした。私が調べた言語のうち、Ruby と PHP だけがこの形式をネイティブにサポートしています。

于 2011-10-01T14:30:22.713 に答える
2

私の知る限り、「パラメーターの送信」以外には何も呼ばれていません。どちらかといえば、これは「パラメータ [型] 変換」と呼ばれ、Rails はそれを単にハッシュに「変換」します。

他のフレームワークはさらに進んで、型変換されたパラメーター値で初期化された型付きオブジェクトを作成するために使用される式としてパラメーター名を使用します。

すべてのパラメータは名前付きの文字列値です。すべての構造は、サーバー側で使用されている言語/フレームワークによって課されます。何に変換されるかは、その言語/フレームワークに 100% 依存しており、その変換の構成要素によって、(合理的な) 呼び出し方が決まります。

于 2011-10-02T13:10:30.350 に答える
0

これは非常に標準的で、最近のほとんどの言語/ライブラリでサポートされている JSON オブジェクトになります。

于 2011-09-28T04:26:52.593 に答える