前言

  • 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]数据解析和绑定的更多相关文章

  1. 02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)

    数据解析和绑定 json数据解析和绑定 package main import ( "github.com/gin-gonic/gin" "net/http" ...

  2. gin框架中的数据解析与绑定

    Json数据解析与绑定 客户端传参,后端接收并解析到结构体 func Login(context *gin.Context) { // 声明接收的变量 var login LoginJson // 将 ...

  3. Vue源码解析---数据的双向绑定

    本文主要抽离Vue源码中数据双向绑定的核心代码,解析Vue是如何实现数据的双向绑定 核心思想是ES5的Object.defineProperty()和发布-订阅模式 整体结构 改造Vue实例中的dat ...

  4. Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题

    1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应 ...

  5. BLE 广播数据解析

    从上一篇GATT Profile 简介中提到过,BLE 设备工作的第一步就是向外广播数据.广播数据中带有设备相关的信息.本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析. 广播模式 BLE ...

  6. vue中如何实现数据的双向绑定

    vue中如何实现数据的双向绑定 实现视图变化数据跟着变:分两步,上面get中的为第二步(即再次读取的时候会调用get方法得到之前设置的值,以此来实现动态改变) 由于直接写obj.name = this ...

  7. 蓝牙BLE: 蓝牙4.0 BLE广播数据解析(转)

    BLE 设备工作的第一步就是向外广播数据.广播数据中带有设备相关的信息.本文主要说一下 BLE 的广播中的数据的规范以及广播包的解析. 1. 广播模式 BLE 中有两种角色 Central 和 Per ...

  8. Linux的.a、.so和.o文件 windows下obj,lib,dll,exe的关系 动态库内存管理 动态链接库搜索顺序 符号解析和绑定 strlen函数的汇编实现分析

    Linux的.a..so和.o文件 - chlele0105的专栏 - CSDN博客 https://blog.csdn.net/chlele0105/article/details/23691147 ...

  9. 数据的双向绑定 Angular JS

    接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...

  10. C#-正则,常用几种数据解析-端午快乐

    在等待几个小时就是端午节了,这里预祝各位节日快乐. 这里分享的是几个在C#中常用的正则解析数据写法,其实就是Regex类,至于正则的匹配格式,请仔细阅读正则的api文档,此处不具体说明,谢谢. 开始吧 ...

随机推荐

  1. OData WebAPI实践-Non-EDM模式

    前文说到了 EDM 与 OData 之间的关系,具有 EDM 的 OData 提供了强大的查询能力,但是 OData 并不必须要配置 EDM,我们也可以使用 Non-EDM 方案. Non-EDM 所 ...

  2. rust语言写的贪吃蛇游戏

    首先新建工程,然后用vscode打开,命令如下: cargo new snake --bin 文件结构如下: Cargo.Toml文件内容如下: [package] name = "snak ...

  3. Redis实战解读-初识Redis&Redis基本数据类型

    Redis实战解读 一.初识Redis 1.什么是Redis ​ Redis是一个速度非常快的非关系型数据库(non-relational database),它可以存储键(key)与五种不同类型的值 ...

  4. 【工作随手记】mysql优化之1

    原SQL: SELECT p.id, p.NAME, p.idcard, p.phone, p.plate, p.FAMILY_NO FROM t_person_info p WHERE p.id I ...

  5. pytorch学习笔记——timm库

    当使用ChatGPT帮我们工作的时候,确实很大一部分人就会失业,当然也有很大一部分人收益其中.我今天继续使用其帮我了解新的内容,也就是timm库.毫不夸张的说,Chat GPT比百分之80的博客讲的更 ...

  6. 泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~

    最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了.之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog. ...

  7. Intellij IDEA最新激活码,适合2022,2023和所有版本,永久更新

    分享一下 IntelliJ IDEA 2023.1 最新激活注册码,破解教程如下,可免费永久激活,亲测有效,下面是详细文档哦~ 申明:本教程 IntelliJ IDEA 破解补丁.激活码均收集于网络, ...

  8. logging 模块因权限问题写入日志失败

    哈喽大家好,我是咸鱼 今天跟大家分享一个使用 Python 的 logging 模块写入日志文件时遇到的权限问题,不知道你们有没有遇到过 1.案例现象 今天上班的时候手机短信收到了 zabbix 告警 ...

  9. 带你彻底掌握Bean的生命周期

    摘要:我们将深入研究Spring Framework的核心部分--Spring Bean的生命周期. 本文分享自华为云社区<Spring高手之路5--彻底掌握Bean的生命周期>,作者: ...

  10. LLE算法的应用场景和案例:详解LLE算法在实际问题中的效果和表现

    目录 引言 随着深度学习技术的不断发展,神经网络模型在人工智能领域的应用越来越广泛.其中,LLE(Largely Element-wise Linear) 神经网络是一种常用的神经网络模型,其基本思想 ...