Golang,Gin框架使用ShouldBindJSON时出现EOF报错

前言

做毕设ing,使用的是Gin框架做的一个简单的管理系统。但偶尔也会碰到一些稀奇古怪的Bug,因此记录一下。

问题描述

api是这样写的

go 复制代码
func UserRegisterHandler(c *gin.Context, user *usecase.UserOperate) {

	if err := c.ShouldBindJSON(&UserRegisterRequest); err != nil {
		log.Error("eeeeeeeeeee", err)
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	userID, err := user.Register(c, UserRegisterRequest.Username, UserRegisterRequest.Password, UserRegisterRequest.Phone)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"userID": userID})
}

其中结构体定义为

go 复制代码
var UserRegisterRequest struct {
	Username string `json:"username"`
	Password string `json:"password"`
	Phone    string `json:"phone"`
}

Postman请求会报错EOF,确定是在ShouldBindJSON的地方出现了错误。

问题解决

先是发现自己忘记了加required标签...

修改后:

go 复制代码
type UserRegisterRequest struct {
	Username string `json:"username" binding:"required"`
	Password string `json:"password" binding:"required"`
	Phone    string `json:"phone" binding:"required"`
}

同时换成了更简单的ShouldBind。发现报错改为:

go 复制代码
Key: 'UserRegisterRequest.Password' Error:Field validation for 'Password' failed on the 'required' tag

遂搜索,参考https://blog.csdn.net/default7/article/details/114920194

发现是自己忘记了定义form...

修改后最终为:

go 复制代码
type UserRegisterRequest struct {
	Username string ` form:"username" json:"username" binding:"required"`
	Password string `form:"password" json:"password" binding:"required"`
	Phone    string `form:"phone" json:"phone" binding:"required"`
}

func UserRegisterHandler(c *gin.Context, user *usecase.UserOperate) {
	var userRegisterRequest UserRegisterRequest

	if err := c.ShouldBind(&userRegisterRequest); err == nil {
		c.JSON(http.StatusOK, gin.H{
			"user":     userRegisterRequest.Username,
			"password": userRegisterRequest.Password,
			"phone":    userRegisterRequest.Phone,
		})
	} else {
		log.Error("绑定JSON错误", err)
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	userID, err := user.Register(c, userRegisterRequest.Username, userRegisterRequest.Password, userRegisterRequest.Phone)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
		return
	}

	c.JSON(http.StatusOK, gin.H{"userID": userID})
}

成功!

总结反思

定义时候注意细节...Go的反引号标签要用好。

相关推荐
源代码•宸14 分钟前
Leetcode—3. 无重复字符的最长子串【中等】
经验分享·后端·算法·leetcode·面试·golang·string
阳明Coding1 小时前
golang从入门到通天—数据库操作(gorm框架使用)(最简单最详细的golang学习笔记)
笔记·学习·golang
源代码•宸6 小时前
Golang原理剖析(逃逸分析)
经验分享·后端·算法·面试·golang··内存逃逸
moxiaoran57536 小时前
Go语言并发处理
开发语言·后端·golang
Tony Bai6 小时前
AI 时代,Go 语言会“失宠”还是“封神”?—— GopherCon 2025 圆桌深度复盘
开发语言·人工智能·后端·golang
tc&6 小时前
新虚拟机安装 Go 环境:问题总结与解决方案
开发语言·后端·golang
钟离墨笺17 小时前
Go语言--2go基础-->基本数据类型
开发语言·前端·后端·golang
shhpeng18 小时前
go gtk 开发入门
golang
钟离墨笺19 小时前
Go语言--2go基础-->map
开发语言·后端·golang
Tony Bai20 小时前
Go 语言的“魔法”时刻:如何用 -toolexec 实现零侵入式自动插桩?
开发语言·后端·golang