[gin]数据解析和绑定

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: [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")
}
相关文章
|
28天前
|
消息中间件 存储 缓存
十万订单每秒热点数据架构优化实践深度解析
【11月更文挑战第20天】随着互联网技术的飞速发展,电子商务平台在高峰时段需要处理海量订单,这对系统的性能、稳定性和扩展性提出了极高的要求。尤其是在“双十一”、“618”等大型促销活动中,每秒需要处理数万甚至数十万笔订单,这对系统的热点数据处理能力构成了严峻挑战。本文将深入探讨如何优化架构以应对每秒十万订单级别的热点数据处理,从历史背景、功能点、业务场景、底层原理以及使用Java模拟示例等多个维度进行剖析。
53 8
|
27天前
|
数据采集 自然语言处理 搜索推荐
基于qwen2.5的长文本解析、数据预测与趋势分析、代码生成能力赋能esg报告分析
Qwen2.5是一款强大的生成式预训练语言模型,擅长自然语言理解和生成,支持长文本解析、数据预测、代码生成等复杂任务。Qwen-Long作为其变体,专为长上下文场景优化,适用于大型文档处理、知识图谱构建等。Qwen2.5在ESG报告解析、多Agent协作、数学模型生成等方面表现出色,提供灵活且高效的解决方案。
126 49
|
15天前
|
XML JSON JavaScript
HttpGet 请求的响应处理:获取和解析数据
HttpGet 请求的响应处理:获取和解析数据
|
1月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
55 2
|
1月前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
113 1
|
27天前
|
数据采集 存储 自然语言处理
基于Qwen2.5的大规模ESG数据解析与趋势分析多Agent系统设计
2022年中国上市企业ESG报告数据集,涵盖制造、能源、金融、科技等行业,通过Qwen2.5大模型实现报告自动收集、解析、清洗及可视化生成,支持单/多Agent场景,大幅提升ESG数据分析效率与自动化水平。
|
1月前
|
JSON 前端开发 JavaScript
API接口商品详情接口数据解析
商品详情接口通常用于提供特定商品的详细信息,这些信息比商品列表接口中的信息更加详细和全面。以下是一个示例的JSON数据格式,用于表示一个商品详情API接口的响应。这个示例假定API返回一个包含商品详细信息的对象。
|
29天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
67 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
75 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0

推荐镜像

更多