2015-10-20 24 views
-1

我正在使用郵遞員在本地主機上發佈json字符串。那蔭傳遞郵差JSON字符串是:請求正文在Go lang(Postman)中爲空

{ 
    「name」: "foo" 
} 

然而,當我在我的測試功能檢索數據時,req.Body我得到這樣的:&{%!s(*io.LimitedReader=&{0xc0820142a0 0}) <nil> %!s(*bufio.Reader=<nil>) %!s(bool=false) %!s(bool=true) {%!s(int32=0) %!s(uint32=0)} %!s(bool=true) %!s(bool=false) %!s(bool=false)}

我希望得到名稱:FOO在請求主體中。

爲同我去郎代碼:

import (
    "encoding/json" 
    "fmt" 
    "net/http" 
) 

type Input struct { 
    Name string `json:"name"` 
} 


func test(rw http.ResponseWriter, req *http.Request) { 
    var t Input 
    json.NewDecoder(req.Body).Decode(&t) 
    fmt.Fprintf(rw, "%s\n", req.Body) 
} 

func main() { 
    http.HandleFunc("/test", test) 
    http.ListenAndServe(":8080", nil) 
} 

誰能告訴我爲什麼我在req.Body屬性獲取空白數據?非常感謝。

+1

你應該打印't'而不是'req.Body'。**請**:處理每一個錯誤 – Volker

+0

@Volker:我試過了。打印t給了我一個空白的'{}'。 ( –

+0

你怎麼打印't'?像''%s「,t.name'或'」%#v「,t'。」{}「的輸出看起來很奇怪,並處理每一個錯誤 – Volker

回答

2

Reuqes身體應該是空的,因爲你已經閱讀了它。但那不是問題。
從你的問題,它似乎你的輸入是無效的JSON(你有這與不同「)。
解碼方法將返回錯誤,你應該檢查。

if err := json.NewDecoder(req.Body).Decode(&t); err != nil { 
    fmt.Println(err) 
} 
+0

解碼方法沒有返回任何錯誤,但與您建議的代碼一起工作良好。我仍然想知道先生err變量在這裏有什麼作用。任何見解將不勝感激。 非常感謝:) –

+0

不像你想象的那樣神奇。如果沒有錯誤返回(錯誤==零),那麼解碼成功。在你的情況下,當't'變量空了,必定會發生一些錯誤! – nvcnvn