当前位置: 首页 > news >正文

golang中struct中大小写对gin框架的影响

1.问题描述

在编写gin框发起post请求时发现如下问题

package mainimport ("fmt""net/http""github.com/gin-gonic/gin"
)type Login struct {user    string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}func main() {r := gin.Default()r.POST("loginJSON", func(ctx *gin.Context) {var json Loginif err := ctx.ShouldBindJSON(&json); err != nil {// gin.H封装了生成json数据的工具ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}fmt.Println("json.user:", json.user, "json.pssword:", json.pssword)if json.user != "root" || json.pssword != "admin" {ctx.JSON(http.StatusBadRequest, gin.H{"status": 304})return}ctx.JSON(http.StatusOK, gin.H{"status": 200})})r.Run(":8001")
}

执行之后访问本地接口如下所示

curl http://127.0.0.1:8001/loginJSON -H 'content-type:application/json' -d "{\"user\":\"root\",\"password\":\"admin111\"}" -X POST
{"status":"304"}

控制台输出如下

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.- using env:	export GIN_MODE=release- using code:	gin.SetMode(gin.ReleaseMode)[GIN-debug] POST   /loginJSON                --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8001
json.user:  json.pssword: 

可以看到账号密码未打印出来

2.大小写在struct中的影响

1. 字段可访问性
首字母大写的字段(如 User, Pssword):
是可导出(Exported)的,可以被其他包访问。
序列化/反序列化库(如 JSON、XML、Gin 的 binding 等)可以正常读写这些字段。
首字母小写的字段(如 user, pssword):
是不可导出(Unexported)的,只能在当前包内访问。
外部库(如 JSON 编码器、Gin 的表单绑定器)无法直接访问这些字段,会导致序列化/反序列化失败。

Gin框架无法正常读写字段,修改之后

3.问题修正

package mainimport ("fmt""net/http""github.com/gin-gonic/gin"
)type Login struct {User    string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}func main() {r := gin.Default()r.POST("loginJSON", func(ctx *gin.Context) {var json Loginif err := ctx.ShouldBindJSON(&json); err != nil {// gin.H封装了生成json数据的工具ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}fmt.Println("json.user:", json.User, "json.pssword:", json.Pssword)if json.User != "root" || json.Pssword != "admin" {ctx.JSON(http.StatusBadRequest, gin.H{"status": 304})return}ctx.JSON(http.StatusOK, gin.H{"status": 200})})r.Run(":8001")
}
C:\Users\PC>curl http://127.0.0.1:8001/loginJSON -H 'content-type:application/json' -d "{\"user\":\"root\",\"password\":\"admin\"}" -X POST
{"status":200}

可以看到访问已经正常,控制台输出也是正常的,问题解决

http://www.lryc.cn/news/576391.html

相关文章:

  • 深入剖析AI大模型:Dify的介绍
  • SpringMVC系列(七)(Restful架构风格(下))(完结篇)
  • SpringMVC系列(五)(响应实验以及Restful架构风格(上))
  • 微软人工智能证书AI-102 | 如何快速通过?
  • JavaScript---数组篇
  • 循环向python异步中增加task的几个方法
  • 【unity游戏开发——网络】网络协议、TCP vs UDP 本质区别
  • 卸载Modelsim/Qustasim方法
  • AngularJS Git 提交消息规范
  • Centos 8设置固定IP
  • Linux通过Crontab实现自启动
  • Grab×亚矩阵云手机:以“云端超级节点”重塑东南亚出行与数字生活生态
  • 第十节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 菜单管理(下)
  • docker部署后端服务的脚本
  • 深入详解:决策树算法的概念、原理、实现与应用场景
  • WHERE 子句中使用子查询:深度解析与最佳实践
  • 设计模式精讲 Day 16:迭代器模式(Iterator Pattern)
  • 如何解决电脑windows蓝屏问题
  • VScode使用usb转网口远程开发rk3588
  • 【龙泽科技】新能源汽车故障诊断仿真教学软件【吉利几何G6】
  • [Linux]从零开始的STM32MP157移植Ubuntu根文件系统教程
  • ubuntu-server 与 ubuntu-live-server 的区别 笔记250628
  • React环境搭建及语法简介
  • Word之空白页删除2
  • 利用GPU加速TensorFlow
  • python多线程详细讲解
  • 【21】C9800配置PSK认证的WLAN
  • 多表连接查询:语法、注意事项与最佳实践
  • 【linux】Vm虚拟机ubuntu的接口ip掉了
  • 电商返利APP架构设计:如何基于Spring Cloud构建高并发佣金结算系统