4

私はGoにかなり慣れていないので、これが些細な質問であれば申し訳ありません。

現在、ネストされたパラメーター ハッシュを使用して POST 要求を作成する関数を作成しようとしています。したがって、javascript などの動的言語での同等の呼び出しは次のようになります。

$.post('http://example.com', {level1: {level2: 'foo'}});

私の Go コードでは、現在、次の方法でハッシュをネストしています。

func (runner *Runner) post(args... interface{}) interface{} {
    form_url := getString(args[0])
    form_data := ???

    http.PostForm(form_url, form_data)

フォーム データの実際のタイプ (interface{}) はサード パーティのライブラリによって提供されるため、実際には変更できません。

問題は、PostForm がフォーム データに url.Values タイプを期待していることです。これは次のように定義されています。

type Values map[string][]string

これを処理する最善の方法は何ですか?これまでの私の結論は、ネストされたハッシュを HTTP エンコードし、次の署名を持つ関数を作成する必要があるということです。

func httpEncodeNestedMap(data interface{}) map[string][]string {...}

Go でのこれの慣用的な実装は何でしょうか?

ありがとう。

4

1 に答える 1

4

基本的に、HTTP では、パラメーター自体の「ネスト」はありません。一部のシステムは、ディメンションをシミュレートする方法でクエリ文字列を解析する機能を提供します。

たとえば、PHP は - 表記をサポートしてい[]ます。PHP では、次のような構造foo[bar]=baz&foo[zar]=booに変換されるクエリ文字列を使用できます。$_REQUEST

 array(
     'foo' => array(
         'bar' => 'baz',
         'zar' => 'boo'
      )
 )

標準の Go ライブラリは、正当な理由からそのような機能を提供していません。ただし、自分で実装できます。

Go がサポートし、PHP がサポートしていない (少なくとも「ネイティブ」ではない) のは、クエリ パラメーターの複数の値です。

type Values map[string][]string

パラメータ名 (文字列インデックス) が複数の値 (文字列のスライス) を持つことができることに注意してください。これは、クエリ文字列が のように見える場合に発生し、次のようfoo=bar&foo=zarになります。

map[string][]string {
    "foo": {
        "bar",
        "zar"
    }
}

これで問題が解決することを願っています。

于 2012-09-03T10:16:08.560 に答える