前言

  • 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. jenkins的安装和配置(flask结合jenkins半自动化部署流程)

    jenkins在虚拟机中安装 1.1 背景介绍 Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建.测试和部署等功能. Je ...

  2. 2022-11-19:第二高的薪水。表结构和数据的sql语句如下,输出200,因为200是第二大的。请问sql语句如何写? DROP TABLE IF EXISTS `employee`; CREAT

    2022-11-19:第二高的薪水.表结构和数据的sql语句如下,输出200,因为200是第二大的.请问sql语句如何写? DROP TABLE IF EXISTS `employee`; CREAT ...

  3. 2020-10-13:hash与B+tree的区别?

    福哥答案2020-10-13: [答案来自知乎:](https://www.zhihu.com/question/425378511/answer/1522000015) 这里我从数据库索引的层面回答 ...

  4. 2022-02-13:k8s安装gitlab,yaml如何写?

    2022-02-13:k8s安装gitlab,yaml如何写? 答案2022-02-13: yaml如下: apiVersion: apps/v1 kind: Deployment metadata: ...

  5. 2021-10-27:课程表。你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisi

    2021-10-27:课程表.你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 .在选修某些课程之前需要一些先修课程. 先修课程按数组 prerequisi ...

  6. AcWing901. 滑雪(python)

    题目详情 知识点 记忆化DP 思路 自己的思路(仅参考):一开始想的是找最大值,然后从最大值开始向下滑,但是我们是要求最长路径,不一定是从最高的点滑下去的,也不一定是滑到最低点,而且会存在最大值不止一 ...

  7. linux LVM和磁盘配额

    目录 一.LVM原理 二.LVM的命令 三.创建lvm过程 四.扩容 五.磁盘配额 一.LVM原理 lvm是逻辑卷管理,可以让用户动态管理磁盘,不用考虑物理磁盘的问题,可以快速扩充磁盘大小,可以不用一 ...

  8. 【HarmonyOS】元服务和APP的相互跳转、相互成就

    ​ [关键字] 卡片.跳转.加桌 [背景介绍] 随着鸿蒙生态的发展,各种类型的应用都已经可以在Harmony OS上无差异的运行,面对鸿蒙新兴元服务的兴起,各大厂家可能都在考虑一个问题:如果已经有AP ...

  9. Dapr在Java中的实践 之 环境准备

    Dapr简介 Dapr (Distributed Application Runtime)是一个可移植的.事件驱动的运行时,它使任何开发人员都可以轻松地构建运行在云和边缘上的弹性.无状态和有状态的应用 ...

  10. Kotlin协程-那些理不清乱不明的关系

    Kotlin的协程自推出以来,受到了越来越多Android开发者的追捧.另一方面由于它庞大的API,也将相当一部分开发者拒之门外.本篇试图从协程的几个重要概念入手,在复杂API中还原出它本来的面目,以 ...