在Go语言中,JSONAsciiJSONPureJSONSecureJSON 是Gin框架用于发送JSON响应的方法。

1. c.JSON

功能:将提供的数据序列化为标准的JSON格式,并将其作为HTTP响应发送给客户端。

特点

  • 支持Unicode字符,无需将非ASCII字符转义。
  • 某些字符(如 <、> 和 &)会被自动转义为相应的 Unicode 转义序列。

使用场景

  • 需要发送包含Unicode字符(如中文、表情符号等)的JSON数据时。

2. c.AsciiJSON

功能:将数据序列化为仅包含ASCII字符的JSON格式,通过转义非ASCII字符确保JSON内容为ASCII编码。

特点

  • 所有非ASCII字符(如中文、特殊符号)会被转义为Unicode编码(如 \uXXXX)。

使用场景

  • 适用于需要确保JSON响应为纯ASCII的场景,例如某些旧版系统或特定的安全需求。
  • 客户端对JSON编码有严格要求,只接受ASCII字符。
  • 避免因非ASCII字符导致的读取或解析问题。

3. c.PureJSON

功能:发送未经额外处理的纯JSON数据,不进行任何包装或转义。

特点

  • 直接将提供的JSON数据发送给客户端。
  • 避免框架对JSON数据进行额外的修改。

使用场景

  • 已经预处理或生成了符合要求的JSON数据,且不希望框架进行任何干预。
  • 需要发送特定格式或结构的JSON响应时。

4. c.SecureJSON

功能:在JSON响应前添加安全前缀,以防止JSON Hijacking(JSON劫持)攻击。

特点

  • 通常在JSON数据前添加特定的字符或字符串(例如 ")]}',\n"),使得响应不再是有效的JavaScript代码,增加安全性。

使用场景

  • 适用于公开API或需要防范特定安全威胁的场景。
  • 提供跨域API时,防止恶意网站通过<script>标签加载JSON数据进行攻击。
  • 需要增强JSON响应的安全性,避免被恶意利用。

代码

package main

import (
"net/http" "github.com/gin-gonic/gin"
) type User struct {
Name string `json:"name"`
Email string `json:"email"`
Names []string `json:"names"`
} func main() {
// 创建默认的Gin引擎
r := gin.Default() // 示例数据
user := User{
Name: "张三", // 包含非ASCII字符
Email: "zhangsan<@example.com>",
Names: []string{"lena", "austin", "foo"},
} // 路由1: 使用 c.JSON(标准JSON响应,支持Unicode)
r.GET("/json", func(c *gin.Context) {
c.JSON(http.StatusOK, user)
// 输出:
// {
// "name": "张三",
// "email": "zhangsan\u003c@example.com\u003e"
// "names": ["lena","austin","foo"]
// }
}) // 路由2: 使用 c.AsciiJSON(ASCII编码的JSON,非ASCII字符会被转义)
r.GET("/ascii-json", func(c *gin.Context) {
c.AsciiJSON(http.StatusOK, user)
// 输出:
// {
// "name": "\u5f20\u4e09",
// "email": "zhangsan\u003c@example.com\u003e"
// "names": ["lena","austin","foo"]
// }
}) // 路由3: 使用 c.PureJSON
// JSON 使用 unicode 替换特殊 HTML 字符,例如 < 变为 \ u003c。如果要按字面对这些字符进行编码,则可以使用 PureJSON
r.GET("/pure-json", func(c *gin.Context) {
c.PureJSON(http.StatusOK, user)
// 输出:
// {"name":"张三","email":"zhangsan<@example.com>, "names":["lena","austin","foo"]}
}) // 路由4: 使用 c.SecureJSON(在JSON前添加安全前缀,防止JSON Hijacking攻击)
// 如果给定的结构是数组值,则默认预置 "while(1)," 到响应体
r.GET("/secure-json", func(c *gin.Context) {
// 默认前缀为 ")];}',\n"
c.SecureJSON(http.StatusOK, user)
// 输出类似于:
// )]}',
// {
// "name": "张三",
// "email": "zhangsan\u003c@example.com\u003e"
// "names": ["lena","austin","foo"]
// }
}) // 启动服务器,监听8080端口
r.Run(":8080")
}

总结

  • c.JSON:标准JSON响应,支持Unicode。
  • c.AsciiJSON:ASCII编码的JSON响应,非ASCII字符会被转义。
  • c.PureJSON:发送未经处理的原始JSON数据。
  • c.SecureJSON:在JSON前添加安全前缀,防止JSON Hijacking攻击。

Go语言【Gin框架】:JSON、AsciiJSON、PureJSON和SecureJSON的区别的更多相关文章

  1. GO语言GIN框架入门

    Gin框架介绍 Gin是一个用Go语言编写的web框架.它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍. 中文文档 Gin框架安装与使用 ...

  2. Go语言web框架 gin

    Go语言web框架 GIN gin是go语言环境下的一个web框架, 它类似于Martini, 官方声称它比Martini有更好的性能, 比Martini快40倍, Ohhhh….看着不错的样子, 所 ...

  3. GO语言web框架Gin之完全指南

    GO语言web框架Gin之完全指南 作为一款企业级生产力的web框架,gin的优势是显而易见的,高性能,轻量级,易用的api,以及众多的使用者,都为这个框架注入了可靠的因素.截止目前为止,github ...

  4. golang(gin框架),基于RESTFUL的跨语言远程通信尝试

    golang(gin框架),基于RESTFUL的跨语言远程通信尝试 背景: 在今年的项目实训过程中,遇到了这样的问题: 企业老师讲课实用的技术栈是Java springboot. 实训实际给我们讲课以 ...

  5. Go语言基础之20--web编程框架之Gin框架

    一.Gin框架介绍 1.1 简介 A. 基于httprouter开发的web框架. http://github.com/julienschmidt/httprouter B. 提供Martini风格的 ...

  6. GO语言web框架Gin之完全指南(二)

    这篇主要讲解自定义日志与数据验证 参数验证 我们知道,一个请求完全依赖前端的参数验证是不够的,需要前后端一起配合,才能万无一失,下面介绍一下,在Gin框架里面,怎么做接口参数验证的呢 gin 目前是使 ...

  7. [go]gin框架

    gin参考 Gin框架返回值 // 返回json func main() { r := gin.Default() //方法一: 自己拼接json // gin.H is a shortcut for ...

  8. 基于gin框架和jwt-go中间件实现小程序用户登陆和token验证

    本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的 ...

  9. gin框架学习手册

    前言 gin框架是go语言的一个框架,框架的github地址是:https://github.com/gin-gonic/gin 转载本文,请标注原文地址:https://www.cnblogs.co ...

  10. 最好的6个Go语言Web框架

    原文:Top 6 web frameworks for Go as of 2017 作者:Edward Marinescu 译者:roy 译者注:本文介绍截至目前(2017年)最好的6个Go语言Web ...

随机推荐

  1. js中栈的运用

    JavaScript 中栈的运用 在 JavaScript 中,栈(Stack)是一种非常有用的数据结构,它遵循后进先出(Last In First Out,LIFO)的原则.在本文中,我们将深入探讨 ...

  2. uni app下开发AI运动小程序解决方案

    一.引言 近年来,随着AI视频识别技术的飞速发展,市场上涌现出了众多基于视觉识别的AI运动APP.这些APP凭借AI视觉识别技术的强大能力,让用户只需面对摄像头进行运动锻炼,就能享受到智能计时.精准计 ...

  3. 开源IDS/IPS Suricata的部署与使用

    目录 前言 在Linux上部署Suricata Suricata的基本配置 配置文件 Suricata的规则 Suricata的使用 Suricata检测SQL注入 前言 Suricata 是一个高性 ...

  4. The 2023 ICPC Asia Hong Kong Regional Programming Contest

    The 2023 ICPC Asia Hong Kong Regional Programming Contest A. TreeScript 给你一个根,让你构造一棵树,每个节点被创造的时候必须知道 ...

  5. 使用七牛云上传文件报错incorrect region, please use up-z1.qiniup.com-迷恋自留地

    最近用Git提交代码时,一直报如标题所示的错误.百度了很多都无法解决,包括改更改配置,SSh等.最后在一个论坛上,说可能之前输入的账号或密码有误.尝试后,完美解决. 解决方法: 找到如下图的位置: 可 ...

  6. uni.showModel内容换行

    前情 最近在做小程序项目,选用有是当前比较火的uniapp技术栈,在产品项目中用到不少的需要引导用户确认后才继续操作的弹框. 为什么想到我去换行? 其实showModel弹框的content是支持自动 ...

  7. 升级到 .NET Core 3.1

    微软升级的频率有点快,转眼 .NET Core 升级到 3.1 版了,这是一个长期支持版本,意味着 .NET Core 正式进入成熟期. 不过,对于开发人员来说,你的项目又需要迁移了. 升级项目文件 ...

  8. 中电金信新捷报:银行客户资源管理领域No.1

    春暖花开,捷报频传 近日,中电金信 客户关系管理系统(CRM) 接连中标 让我们共同见证这波喜讯 01 中电金信凭借优秀的解决方案和丰富的服务案例经验,成功中标某全国性股份制银行同业CRM实施服务采购 ...

  9. Smalltalk 和 VB

    在水木看到一个帖为什么 Smalltalk 没落了?,提到两篇好文: http://www.wirfs-brock.com/allen/posts/914 https://gbracha.blogsp ...

  10. shell学习之路——取参数

    shell中参数的调用方式: 1.$0-9:表示第0个到第9个参数,其中$0表示文件执行路径.如:$0,$1. 2.${10以后}:如果参数数目大于9个,可以用${10},${11}...等方式表示. ...