2012-09-02 3 views
3

이동하기가 상당히 쉽습니다. 사소한 질문 인 경우 사과드립니다.POST 중첩 인수가 포함 된 요청

현재 중첩 된 매개 변수 해시가있는 POST 요청을 만드는 함수를 작성하려고합니다. 그래서 동적 언어에 해당하는 전화는 자바 스크립트 것 같은 :

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

    http.PostForm(form_url, form_data) 

의 실제 유형 : 내 이동 코드에서

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

, 나는 현재 다음과 같은 방법으로 중첩 된 해시를 가지고 있습니다 양식 데이터 (인터페이스 {})는 타사 라이브러리에서 제공되므로 실제로 변경할 수는 없습니다.

문제는 PostForm가

type Values map[string][]string 

로 정의되는 형태의 데이터에 대한 url.Values ​​유형을 기대 이것은 무엇을 처리하는 가장 좋은 것입니다?

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

은 무엇 이동이의 관용적 구현 될 것이다 : 내 결론은 지금까지 내가 HTTP가 중첩 된 해시를 인코딩하고 다음 서명을 것이다 함수를 작성해야한다는 것입니다?

감사합니다.

답변

4

기본적으로 HTTP에는 매개 변수의 '중첩'이 없습니다. 일부 시스템은 차원을 시뮬레이트하는 방식으로 쿼리 문자열을 구문 분석하는 기능을 제공합니다.

예를 들어, PHP는 []- 주석을 지원합니다. 표준 이동 라이브러리가 유효 이유로 이러한 기능을 제공하지 않습니다

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

: PHP에서는이 같은 $_REQUEST 구조로 변환 할 foo[bar]=baz&foo[zar]=boo 같은 쿼리 문자열을 가질 수 있습니다. 자신 만의 방법으로 구현할 수 있습니다.

어떤 Go가 지원되며 PHP는 지원하지 않습니다 (최소한 "기본적으로")는 쿼리 매개 변수에 대해 여러 값을가집니다.

type Values map[string][]string 

매개 변수 이름 (문자열 인덱스)이 여러 값 (문자열 조각)을 가질 수 있습니다.

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

나는이 일을 지 웁니다 희망이 당신의 쿼리 문자열이 foo=bar&foo=zar처럼 보이는 경우, 당신은 얻을 것 발생했을.