2014-12-27 4 views
2

JSON 인수를 내 서버로 보내고 json.Decoder를 사용하여 구문 분석하려고합니다. request.Body 속성에서 쿼리 매개 변수를 가져올 수 있어야한다고 읽었습니다.Golang net/http 요청 본문 항상 비어 있습니다.

func stepHandler(res http.ResponseWriter, req *http.Request) { 
    var v interface{} 
    err := json.NewDecoder(req.Body).Decode(&v) 
    if err != nil { 
     // handle error 
    } 
    log.Println(v) 
} 

때마다, 나는 (물론, DIFF 타임 스탬프) 2014/12/26 22:49:23 <nil> 참조 : 다음은 내 서버 코드입니다.

$.ajax({ 
    url: "/step", 
    method: "get", 
    data: { 
    steps: $("#step-size").val(), 
    direction: $("#step-forward").prop("checked") ? 1 : -1, 
    cells: JSON.stringify(painted) 
    }, 
    success: function (data) { 
    painted = data; 
    redraw(); 
    }, 
    error: function (xhr) { 
    console.log(xhr); 
    } 
}); 

전송되는 어떤 URL의 예 :

http://localhost:5000/?steps=1&direction=1&cells=%5B%7B%22row%22%3A11%2C%22column%22%3A15%7D%2C%7B%22row%22%3A12%2C%22column%22%3A15%7D%5D 

가 PARAMS에서 더 좋은 모습이 :

{ 
    steps: "1", 
    direction: "1", 
    cells: "[{"row":11,"column":15},{"row":12,"column":15}]" 
} 

내가 함께 시도 내 클라이언트 측 AJAX 호출은 다음과 같다 GET 및 POST 요청.

왜 내 req.Body가 해독되지 않습니까? req.Body 만 인쇄하려고하면 nil도 보입니다.

+0

'req.Body'는 실제로 비어 있습니다. 그래서'req.ParseForm()'을 호출하고 대신'req.Form'을 사용하십시오. 'Body'가 어떻게 든 요청의 본문에 **없는 ** 쿼리 매개 변수를 얻을 것이라는 인상을주었습니다. –

+0

나는 req.Body가 참조한 것의 오해가있는 것 같았다. req.Form이 나에게지도를 준다. 쿼리 문자열을 객체로 자동으로 비 정렬 화하는 방법이 있는가? –

+0

@AlexMartelli, 나는 당신의 해결책을 찾아갔습니다. 답변을 만들면이 질문의 해결책으로 표시 할 수 있습니다. 정말 고맙습니다! –

답변

4

req.Body은 실제로 비어 있습니다. 그래서, 나는 무엇을 할 것인가? req.ParseForm()을 호출하고 대신 req.Form을 사용합니다. Body은 요청 본문에없는 항목 (예 : 검색어 매개 변수)을 가져 오지 않습니다.

0

요청의 Body은 페이로드 내부를 따라 전송됩니다. 이는 URL의 일부가 아닙니다.

실제로 데이터가 URL에있는 경우 본문에 액세스하려고합니다.

아약스 을 method: "post"으로 변경하여 데이터가 URL의 일부가 아닌 본문과 함께 게시되도록하려면 어떻게해야합니까? 브라우저의 선택 '개발자 도구를 통해 요청과 함께 데이터가 실제로 전송되는지 확인해야합니다. 또는 데이터를 URL의 일부로 보내려면 요청의 URL 매개 변수에 액세스하고 구조체에 값을 수동으로 파싱해야합니다 (JSON 패키지는 IIRC에서이 작업을 수행하지 않습니다).

+0

Json은하지 않을 것이지만,'req.ParseForm()'('req.Form'에 접근)은 당신을 대신하여 파싱을해야합니까? –

+0

예 - 요점은 json 패키지의'Decode' 메소드와 달리 구조체에 매핑하는 것이 수동 프로세스가된다는 것입니다. –

+0

POST로 내 메서드를 변경해 보았습니다. 그리고 데이터가 페이로드로 본문에 전송되었음을 확인했지만 디코딩하려고 할 때마다 여전히 nil을 얻습니다. 그러나 이제 내 몸은 '& {0xc208020620 거짓 {0 0} 거짓}'처럼 보입니다. –

관련 문제