[gin]数据解析和绑定
前言
- go version: 1.18
本文主要包含JSON、Form、Uri、XML的数据解析与绑定。
JSON数据解析与绑定
- go代码
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
// 定义接收JSON数据的结构体
type Login struct {
Username string `form:"username" json:"username" uri:"username" xml:"username" binding:"required"`
Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}
func f1(c *gin.Context){
var json Login
// 将数据解析到结构体中
if err := c.ShouldBindJSON(&json); err != nil {
// 返回错误信息
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"Username": json.Username,
"Password": json.Password,
})
}
func main() {
r := gin.Default()
v1 := r.Group("/v1")
{
v1.POST("/loginjson", f1)
}
r.Run("192.168.0.10:8001")
}
- curl 测试
curl -X POST \
-H 'Content-type:application/json' \
-d '{"username":"zhangsan","password": "qwerty"}' \
http://192.168.0.10:8001/v1/loginjson
- python - requests测试
import json
import requests
data_json = {
"username": "zhangsan",
"password": "123456",
}
url = "http://192.168.0.10:8001/v1/loginjson"
resp = requests.post(url, data = json.dumps(data_json))
print(resp.text)
表单数据解析与绑定
- go代码
func f2(c *gin.Context){
var form Login
// 将数据解析到结构体中
if err := c.Bind(&form); err != nil {
// 返回错误信息
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"Username": form.Username,
"Password": form.Password,
})
}
v1.POST("loginform", f2)
- python - requests测试
import requests
data = {
"username": "zhangsan",
"password": "123456",
}
url = "http://192.168.0.10:8001/v1/loginform"
resp = requests.post(url, data = data)
print(resp.text)
- curl测试
curl -d "username=zhangsan&password=qwerty" \
http://192.168.0.10:8001/v1/loginform
URI数据解析与绑定
- go代码
func f3(c *gin.Context){
// uri数据解析与绑定
var uri Login
// 将数据解析到结构体中
if err := c.ShouldBindUri(&uri); err != nil {
// 返回错误信息
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"Username": uri.Username,
"Password": uri.Password,
})
}
v1.GET("/loginuri/:username/:password", f3)
- curl 测试
curl 'http://192.168.0.10:8001/v1/loginuri/zhangsan/asdfgh'
XML数据解析与绑定
- go代码
func f4(c *gin.Context){
// xml数据解析与绑定
var xml Login
// 将数据解析到结构体中
if err := c.ShouldBindXML(&xml); err != nil {
// 返回错误信息
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"Username": xml.Username,
"Password": xml.Password,
})
}
v1.POST("/loginxml", f4)
- python - requests 测试
import requests
data_xml = """
<?xml version="1.0" encoding="utf-8"?>
<server>
<username>lisi</username>
<password>123456</password>
</server>
"""
url = "http://192.168.0.10:8001/v1/loginxml"
resp = requests.post(url, data = data_xml)
print(resp.text)
参考
附录 - 完整go示例代码
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
// 定义接收JSON数据的结构体
type Login struct {
Username string `form:"username" json:"username" uri:"username" xml:"username" binding:"required"`
Password string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}
func f1(c *gin.Context){
// JSON数据解析与绑定
var json Login
// 将数据解析到结构体中
if err := c.ShouldBindJSON(&json); err != nil {
// 返回错误信息
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"Username": json.Username,
"Password": json.Password,
})
}
func f2(c *gin.Context){
// 表单数据解析与绑定
var form Login
// 将数据解析到结构体中
if err := c.Bind(&form); err != nil {
// 返回错误信息
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"Username": form.Username,
"Password": form.Password,
})
}
func f3(c *gin.Context){
// uri数据解析与绑定
var uri Login
// 将数据解析到结构体中
if err := c.ShouldBindUri(&uri); err != nil {
// 返回错误信息
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"Username": uri.Username,
"Password": uri.Password,
})
}
func f4(c *gin.Context){
// xml数据解析与绑定
var xml Login
// 将数据解析到结构体中
if err := c.ShouldBindXML(&xml); err != nil {
// 返回错误信息
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
c.JSON(http.StatusOK, gin.H{
"Username": xml.Username,
"Password": xml.Password,
})
}
func main() {
r := gin.Default()
v1 := r.Group("/v1")
{
v1.POST("/loginjson", f1)
v1.POST("/loginform", f2)
v1.GET("/loginuri/:username/:password", f3)
v1.POST("/loginxml", f4)
}
r.Run("192.168.0.10:8001")
}
[gin]数据解析和绑定的更多相关文章
- 02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)
数据解析和绑定 json数据解析和绑定 package main import ( "github.com/gin-gonic/gin" "net/http" ...
- gin框架中的数据解析与绑定
Json数据解析与绑定 客户端传参,后端接收并解析到结构体 func Login(context *gin.Context) { // 声明接收的变量 var login LoginJson // 将 ...
- Vue源码解析---数据的双向绑定
本文主要抽离Vue源码中数据双向绑定的核心代码,解析Vue是如何实现数据的双向绑定 核心思想是ES5的Object.defineProperty()和发布-订阅模式 整体结构 改造Vue实例中的dat ...
- Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题
1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应 ...
- BLE 广播数据解析
从上一篇GATT Profile 简介中提到过,BLE 设备工作的第一步就是向外广播数据.广播数据中带有设备相关的信息.本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析. 广播模式 BLE ...
- vue中如何实现数据的双向绑定
vue中如何实现数据的双向绑定 实现视图变化数据跟着变:分两步,上面get中的为第二步(即再次读取的时候会调用get方法得到之前设置的值,以此来实现动态改变) 由于直接写obj.name = this ...
- 蓝牙BLE: 蓝牙4.0 BLE广播数据解析(转)
BLE 设备工作的第一步就是向外广播数据.广播数据中带有设备相关的信息.本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析. 1. 广播模式 BLE 中有两种角色 Central 和 Per ...
- Linux的.a、.so和.o文件 windows下obj,lib,dll,exe的关系 动态库内存管理 动态链接库搜索顺序 符号解析和绑定 strlen函数的汇编实现分析
Linux的.a..so和.o文件 - chlele0105的专栏 - CSDN博客 https://blog.csdn.net/chlele0105/article/details/23691147 ...
- 数据的双向绑定 Angular JS
接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...
- C#-正则,常用几种数据解析-端午快乐
在等待几个小时就是端午节了,这里预祝各位节日快乐. 这里分享的是几个在C#中常用的正则解析数据写法,其实就是Regex类,至于正则的匹配格式,请仔细阅读正则的api文档,此处不具体说明,谢谢. 开始吧 ...
随机推荐
- Llinux系统(Centos/Ubuntu/Debian)弹性云系统盘扩容方法
警告: 1.调整过分区管理方式的,例如lvm管理方式,请忽略此教程. 2.ubuntu18系统暂不支持脚本扩容,请手动扩容,参看下面ubuntu18部分,用parted操作 脚本自动处理(推荐) SS ...
- 联想win8改win7
知识点分析:目前联想出厂预装Windows 8的台式和一体机使用都是UEFI+GPT硬盘的组合,并且开启了安全启动,但是目前除Window 8以外的其他Windows系统均不支持这种模式,因此如果需要 ...
- 2020-10-10:OOM都有哪些,说出几种?
福哥答案2020-10-10:#福大大架构师每日一题# [答案参考了此链接:](https://cloud.tencent.com/developer/article/1480668) 本地方法栈:1 ...
- 2022-08-17:以下go语言代码输出什么?A:运行时 panic;B:32;C:编译错误;D:0。 package main func main() { var x *struct {
2022-08-17:以下go语言代码输出什么?A:运行时 panic:B:32:C:编译错误:D:0. package main func main() { var x *struct { s [] ...
- Django笔记四十之运行Django环境的python脚本
本文首发于公众号:Hunter后端 原文链接:Django笔记四十之运行Django环境的python脚本 这一篇笔记介绍如何在 Django 中运行脚本. 假设说我们要实现一个功能,需要获取 blo ...
- 在程序里如何停止整个python项目的运行
我们的项目无可避免的会遇到一些场景,当出现某个故障或者异常,必须停止整个项目的运行,这时只需要在抛出的异常里执行以下即可: os._exit(0)
- dotnet平台Http消息处理者工厂
1 前言 Microsoft.Extensions.Http是一个设计非常优异的客户端工厂库,其提供了IHttpClientFactory用于创建HttpClient和IHttpMessageHand ...
- 这可能是最全面的Java面试八股文了
Java的特点 Java是一门面向对象的编程语言.面向对象和面向过程的区别参考下一个问题. Java具有平台独立性和移植性. Java有一句口号:Write once, run anywhere,一次 ...
- git从配置到使用
一 .安装git 1.1 官方地址为:https://git-scm.com/download/win 1.2 双击下载的.exe文件 1.3 直接下一步 1.4 自定义安装目录 1.5 勾选命令行和 ...
- ABP - 缓存模块(1)
1. 与 .NET Core 缓存的关系和差异 ABP 框架中的缓存系统核心包是 Volo.Abp.Caching ,而对于分布式缓存的支持,abp 官方提供了基于 Redis 的方案,需要安装 Vo ...