Golang中为什么r.body为空
Golang中为什么r.body为空 我在主函数中有一个处理器
router.HandleFunc("/books", addBook).Methods("POST")
以及一个addBook函数,该函数应将新书籍添加到我的Book切片中
func addBook(w http.ResponseWriter, r *http.Request) {
var book Book
fmt.Println(r.Body)
json.NewDecoder(r.Body).Decode(&book)
books = append(books, book)
json.NewEncoder(w).Encode(books)
}
但不幸的是,当我在Postman中发送包含行代码的POST请求时, addBook函数会将空字符串和零值添加到我的Book切片中 以下是我的书籍类型
type Book struct {
ID int `json:"id"`
Title string `json:"title"`
Author string `json:"author"`
Year string `json:"year"`
}
我在Postman中的查询
{
"id": 7,
"title": "Mai",
"author": "Selpak",
"year": "2017",
}
更多关于Golang中为什么r.body为空的实战教程也可以访问 https://www.itying.com/category-94-b0.html
已解决,我的问题,忘记在Postman中将查询标记为JSON格式,抱歉
更多关于Golang中为什么r.body为空的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中,r.Body为空通常是由于请求体已经被读取过或者请求体本身为空导致的。在你的代码中,fmt.Println(r.Body)会尝试读取请求体,这可能导致后续的json.NewDecoder(r.Body).Decode(&book)无法正确解析数据。
问题在于fmt.Println(r.Body)会消耗请求体,因为r.Body是一个io.ReadCloser,读取后位置会移动。当json.NewDecoder尝试读取时,请求体已经到达末尾,因此无法解码数据到book结构体,导致空值。
以下是修复后的代码示例:
func addBook(w http.ResponseWriter, r *http.Request) {
var book Book
// 直接解码请求体,避免先打印r.Body
err := json.NewDecoder(r.Body).Decode(&book)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
defer r.Body.Close() // 确保关闭请求体
// 添加新书到切片
books = append(books, book)
// 返回更新后的书籍列表
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(books)
}
关键点:
- 移除
fmt.Println(r.Body),因为它会消耗请求体。 - 添加错误处理,如果JSON解码失败返回400错误。
- 使用
defer r.Body.Close()确保请求体被正确关闭。 - 设置响应头的Content-Type为
application/json。
在Postman中,确保请求方法为POST,URL正确(例如http://localhost:8080/books),Body选择raw并设置为JSON格式,且内容与你的示例一致。这样请求体就能被正确解析,book结构体将包含非空值。

