2017-01-01 31 views
0

我試圖用go-json-rest創建RESTful API中細末JSON的REST:JSON有效載荷爲空

我有這個模型的結構:

type Todo struct { 
    id int 
    name string 
} 

,我試圖做一個POST請求創建Todo類型的對象:

func CreateTodo(w rest.ResponseWriter, r *rest.Request) { 

    body, _ := ioutil.ReadAll(r.Body) 
    log.Println("body content is: ", string(body)) // here I can see {"name": "test1"} 
    var todo Todo = Todo{} 
    err := r.DecodeJsonPayload(&todo) // here the error shows JSON payload is empty 
    defer r.Body.Close() 

    if err != nil { 
     log.Println("error in parsing json") 
     rest.Error(w, err.Error(), http.StatusInternalServerError) 
     return 
    } 

    if todo.name == "" { 
     rest.Error(w, "todo name is required", 400) 
     return 
    } 
    lock.Lock() 

    var nextId int = len(todos) 
    // todos[nextId] = todo 
    todo.id = nextId // set its id 
    todos = append(todos, todo) 
    log.Println("num of todos: ", len(todos)) 
    lock.Unlock() 

    w.WriteJson(&todo) 
} 

然而,在郵遞員客戶端的控制檯上,該錯誤表明:

{ 
    "Error": "JSON payload is empty" 
} 

我想知道哪裏可能出問題。由於

編輯: 這不應被視爲重複的問題,因爲我也不試圖用json包做JSON對象編組/解組。相反,我使用rest.Request對象(內置go-json-rest)來解碼從客戶端發佈的json參數。

在這個問題上多挖掘和搜索之後,我發現下面的解決我的問題這樣的回答:

body, _ := ioutil.ReadAll(r.Body)會消耗一切從 請求主體。所以刪除這一行後,json解析工作!

+3

大寫struct字段名稱'id'和'name'。 –

+0

這不是一個重複的問題。看到我上面的編輯 – TonyGW

回答

0

在解碼JSON參數之前,我只是在做着body, _ := ioutil.ReadAll(r.Body)而沒有真正理解ioutil.ReadAll()對請求主體做什麼。

正如我在編輯過的文章中引用的那樣,ioutil.ReadAll()消耗了請求體中的所有內容,沒有爲json解碼器解析任何內容。刪除行body, _ := ioutil.ReadAll(r.Body)後,json解析按預期工作。