gin框架10--XML/JSON/YAML/ProtoBuf 渲染

2023-11-12

gin框架10--XML/JSON/YAML/ProtoBuf 渲染

介绍

本文主要介绍gin 中的 XML/JSON/YAML/ProtoBuf 等常见渲染方法,以及其测试结果。

案例

源码:

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/testdata/protoexample"
	"net/http"
)

func main() {
	r := gin.Default()

	// gin.H 是 map[string]interface{} 的一种快捷方式
	r.GET("/someJSON", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})
	})

	r.GET("/moreJSON", func(c *gin.Context) {
		// 你也可以使用一个结构体
		var msg struct {
			Name    string `json:"user"`
			Message string
			Number  int
		}
		msg.Name = "Lena"
		msg.Message = "hey"
		msg.Number = 123
		// 注意 msg.Name 在 JSON 中变成了 "user"
		// 将输出:{"user": "Lena", "Message": "hey", "Number": 123}
		c.JSON(http.StatusOK, msg)
	})

	r.GET("/someXML", func(c *gin.Context) {
		c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})
	})

	r.GET("/someYAML", func(c *gin.Context) {
		c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK})
	})

	r.GET("/someProtoBuf", func(c *gin.Context) {
		reps := []int64{int64(1), int64(2)}
		label := "test"
		// protobuf 的具体定义写在 testdata/protoexample 文件中。
		data := &protoexample.Test{
			Label: &label,
			Reps:  reps,
		}
		// 请注意,数据在响应中变为二进制数据
		// 将输出被 protoexample.Test protobuf 序列化了的数据
		c.ProtoBuf(http.StatusOK, data)
	})

	// 监听并在 0.0.0.0:8080 上启动服务
	r.Run(":8080")
}

此处 protoexample.Test 结构体在 github.com/gin-gonic/gin/testdata/protoexample 中,具体格式如下:

type Test struct {
	Label            *string             `protobuf:"bytes,1,req,name=label" json:"label,omitempty"`
	Type             *int32              `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"`
	Reps             []int64             `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"`
	Optionalgroup    *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"`
	XXX_unrecognized []byte              `json:"-"`
}

测试:

$ curl -XGET 127.0.0.1:8080/someJSON
{"message":"hey","status":200}

$ curl -XGET 127.0.0.1:8080/moreJSON
{"user":"Lena","Message":"hey","Number":123}

$ curl -XGET 127.0.0.1:8080/someXML
<map><message>hey</message><status>200</status></map>

在浏览器访问 someYAML 会直接将该文件下载下来
$ curl -XGET 127.0.0.1:8080/someYAML
message: hey
status: 200


在浏览器访问 someProtoBuf 会直接将该文件下载下来
$ curl -XGET 127.0.0.1:8080/someProtoBuf

test

说明

gin官方文档 XML/JSON/YAML/ProtoBuf 渲染

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gin框架10--XML/JSON/YAML/ProtoBuf 渲染 的相关文章

  • golang-bufio 缓冲扫描

    前面两篇博客 介绍了 bufio 包中的缓冲读和写 bufio go 下面再来介绍一下缓冲扫描 scan go 这个扫描的是用来对缓存读的更高级封装 提供了一些更易用的方法 缓冲扫描 Scanner 提供了一个方便的接口来读取数据 例如使用
  • Golang教程:(十六)结构体

    原文 https golangbot com structs 欢迎来到Golang系列教程的第十六篇 什么是结构体 结构体 struct 是用户自定义的类型 它代表若干字段的集合 有些时候将多个数据看做一个整体要比单独使用这些数据更有意义
  • 【Golang入门】Golang第一天心得

    生活所迫 入门一下Go 很奇葩的第一点 接口 package main import fmt 定义一个接口 type Shape interface Area float64 定义一个矩形类型 type Rectangle struct W
  • Golang-使用 goroutine 运行闭包的“坑”

    介绍 在 Go 语言中 函数支持匿名函数 闭包就是一种特殊的匿名函数 它可以用于访问函数体外部的变量 需要注意的是 在 for range 中 使用 goroutine 执行闭包时 经常会掉 坑 因为匿名函数可以访问函数体外部的变量 而 f
  • 权重实现随机抽奖

    一般抽奖是怎么实现的 在实习期间学会了一种通用的写法 在这里记录一下 最近在学Golang语法基础 这里就用Golang来写 package main import fmt time math rand func main r rand N
  • Qt webengine 显示web页面、前后端通信以及下载详解

    概述 官方文档 https doc qt io archives qt 5 11 qtwebengine overview html 翻译文档 Qt5 9 WebEngine 概述 一花一世界 一叶一乾坤 博客园 从Qt5 5开始 Qt W
  • go 进阶 go-zero相关: 七. 拦截器与熔断拦截器

    目录 一 拦截器的基础使用 1 服务端拦截器 2 客户端拦截器 二 拦截器底层底层执行原理 三 go zero默认添加的拦截器 客户端 1 熔断器拦截器 BreakerInterceptor 服务端 一 拦截器的基础使用 在go zero
  • 【golang】error parsing regexp: invalid or unsupported Perl syntax (正则表达式校验密码)

    要在 Go 中编写密码校验规则 确保密码不少于8位且包含数字和字母 你可以使用正则表达式和 Go 的 regexp 包来实现 以下是一个示例代码 错误示范 package main import fmt regexp func valida
  • goland环境配置

    goland modules环境配置 下载和安装goland 环境配置 配置环境变量GOPATH 配置go modules GOPROXY代理的系统变量 工程目录中新建三个工作目录 goland中启用go modules 新建一个go程序
  • 为什么最近听说 Go 岗位很少很难?

    大家好 我是煎鱼 其实这个话题已经躺在我的 TODO 里很久了 近来很多社区的小伙伴都私下来交流 也有在朋友圈看到朋友吐槽 Go 上海的大会没什么人 还不如 Rust 大会 比较尴尬 今天主要是看看为什么 Go 岗位看起来近来很难的样子 也
  • 掌握 Go 语言中的循环结构:从基础到高级

    一 if else 分支结构 1 if 条件判断基本写法 package main import fmt func main score 65 if score gt 90 fmt Println A else if score gt 75
  • go-zero目录结构和说明

    code of conduct md 行为准则 CONTRIBUTING md 贡献指南 core 框架的核心组件 bloom 布隆过滤器 用于检测一个元素是否在一个集合中 breaker 熔断器 用于防止过多的请求导致系统崩溃 cmdli
  • go-zero开发入门之gateway深入研究1

    创建一个 gateway 示例 main go package main import flag fmt gateway middleware github com zeromicro go zero core conf github co
  • go-zero开发入门-API网关鉴权开发示例

    本文是 go zero开发入门 API网关开发示例 一文的延伸 继续之前请先阅读此文 在项目根目录下创建子目录 middleware 在此目录下创建文件 auth go 内容如下 鉴权中间件 package middleware impor
  • GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

    这章是接上一章 使用 RPC包 序列化中没有详细去讲 因为这一块需要看的和学习的地方很多 并且这一块是RPC中可以说是最重要的一块 也是性能的重要影响因子 今天这篇主要会讲其使用方式 文章目录 Protocol Buffers V3 背景以
  • GoLong的学习之路,进阶,Viper(yaml等配置文件的管理)

    本来有今天是继续接着上一章写微服务的 但是这几天有朋友说 再写Web框架的时候 遇到一个问题 就是很多的中间件 redis 微信 mysql mq 的配置信息写的太杂了 很不好管理 希望我能写一篇有管理配置文件的 所以这篇就放到今天写吧 微
  • Go 语言中切片的使用和理解

    切片与数组类似 但更强大和灵活 与数组一样 切片也用于在单个变量中存储相同类型的多个值 然而 与数组不同的是 切片的长度可以根据需要增长和缩小 在 Go 中 有几种创建切片的方法 使用 datatype values 格式 从数组创建切片
  • 【golang】go执行shell命令行的方法( exec.Command )

    所需包 import os exec cmd 的用法 cmd exec Command ls lah ls是命令 后面是参数 e cmd Run 多个参数的要分开传入 如 ip link show bond0 cmd
  • [每周一更]-(第55期):Go的interface

    参考地址 https juejin cn post 6978322067775029261 https gobyexample com interfaces https go dev tour methods 9 介绍下Go的interfa
  • golang 生成一年的周数

    GetWeekTimeCycleForGBT74082005 获取星期周期 中华人民共和国国家标准 GB T 7408 2005 参数 year 年份 GB T 7408 2005 func GetWeekTimeCycleForGBT74

随机推荐

  • Java实现给图片局部打马赛克

    因为项目需要用到给图片打码的功能 本身实现也不是很复杂 就没有借鉴其他类库 参照网上的一些资料实现了一个简单的给图片局部打码的功能 也可以给一个图片的多个局部进行打码 ImageArea java package com test 图片区域
  • hdfs写数据流程

    上面图看不懂没关系 下面我有简单语言说明下其过程 现在客户端要上传一个300M的文件 1客户端先请求namenode 告诉namenode我有上传一个叫作cls 初解禁的文件 2namenode检查元数据中是否有这个文件 有就告诉客户端这个
  • 量子遗传算法原理与MATLAB仿真程序

    写在前面 1 其实这些智能算法的思想都差不多 只不过是各自搜寻方式 编码方式 种群更新方式等不一样而已 量子遗传算法是在遗传算法的基础上使用了一种新的编码方式 2 直接看前面介绍可能会觉得较难 先浏览概念任何根据案例走一遍就明白了 3 遗传
  • 阿里巴巴Java开发手册(详尽PDF版).

    前言 不知不觉间 2022 年已经过了一半了 作为技术圈中你 准备好迎接最新的变化了吗 在本文中 我们将以编程界最常用的编程语言 Java 为例 分享最为主流的技术与工具 目录 一 编程规约 一 命名风格 二 常量定义 三 代码格式 四 0
  • MDK中undefined常见错误警告解决

    c文件中包含 h文件 添加 h文件和 c文件路径 同名 h文件是否存在重复 加入 ifndef后不易找出该错误 一般在库搬移中会出现该错误 可以通过在工程文件下搜索该 h c文件查看是否有同名存在 这点很重要 有时候编译不过卡了半天就在这个
  • 嵌入式系统的通讯协议:I2C通讯、SPI通讯、USB通讯、SDIO 通讯、I2S通讯、PCI通讯简介

    本文简单的描述了在实际应用中会碰到的一些总线协议 让各位读者对实际系统中的总线有个概念上的理解 一 I2C I2C Inter Integrated Circuit 总线是一种由PHILIPS公司开发的两线式串行总线 用于连接微控制器及其外
  • Chrome 69 域名不显示 www 的解决办法

    Chrome 69 域名不显示 www 的解决办法 复制以下内容到 Chrome 地址栏 选择 Disabled 即可 chrome flags omnibox ui hide steady state url scheme and sub
  • 【Shell牛客刷题系列】SHELL25 nginx日志分析3-统计访问3次以上的IP

    该系列是基于牛客Shell题库 针对具体题目进行查漏补缺 学习相应的命令 刷题链接 牛客题霸 Shell篇 该系列文章都放到专栏下 专栏链接为 专栏 Shell 欢迎关注专栏 本文知识预告 本文首先复习了grep awk sed cut等命
  • CSS3学习笔记(1)

    1 什么是CSS 样式表定义如何显示 HTML 元素 就像 HTML 中的字体标签和颜色属性所起的作用那样 样式通常保存在外部的 css 文件中 我们只需要编辑一个简单的 CSS 文档就可以改变所有页面的布局和外观 2 CSS规则 CSS声
  • 打印1000到2000之间的闰年,并统计闰年的次数。 (C语言)

    分析 判断是否为闰年条件为以下 1 能被4整除并且不能被100整除的是闰年 2 能被400整除的是闰年 代码 include
  • 重写(覆盖)和重载的区别

    牛客网题 下列对函数double add int a int b 进行重载 正确的是 int add int a int b int c int add double a double b double add double a doubl
  • 设置固定ip地址bat文件_iPad/iPhone通过smb与Windows互传文件

    更新 前段时间我的iPhone iPad莫名其妙连不上了 今天又仔细检查了一下 发现是因为电脑的IPv4地址自己变了 原本是192 168 0 104 现在变成了192 168 0 101 也就是smb 之后要输入的地址 查这个地址的方法是
  • stop带有临时表的slave步骤

    author skate time 2014 06 30 stop带有临时表的slave步骤 在stop slave之前一定要确定变量 Slave open temp tables 为0 如果在不为0时 停止了slave server或sl
  • 不要再在以太坊和Metamask开发web时使用密码

    我在ConsenSys为各种客户构建了大量的概念证明 通常他们想要利用以太坊区块链来解决某些业务用例 奇怪的是 这些系统通常设计有标准的网络登录 即用户名和密码 我总是问自己为什么我还在这样做设计 毕竟 这是今天以太网目前可以解决每个烦人的
  • QT学习——Qt工具介绍,Qt助手使用,第一个Qt程序,Qt字符串和字符编码

    一 Qt主要工具介绍 1 qt助手 assistant 2 qt构建器 qmake 3 qt设计师 designer 4 qt转换器 uic 5 qt资源编译器 rcc 6 qt元对象编译器 moc 处理语法扩展 7 qt创造器IDE qt
  • 线程安全:同步代码块

    一 线程安全 如果多个线程在同时运行 而这些线程可能会同时运行这段代码 程序每次运行结果和单线程的结果一样的 而且其他的变量的值和预期的是一样的 就是线程安全的 public class Ticker implements Runnable
  • 嵌入式编写TCP连接过程

    先来一个三次握手和四次挥手 嵌入式连接过程 1 af 为地址族 Address Family 也就是 IP 地址类型 常用的有 AF INET 和 AF INET6 AF 是 Address Family 的简写 INET是 Inetnet
  • Python爬虫常用库及解析库解析

    作者 禅与计算机程序设计艺术 1 简介 随着互联网的快速发展 越来越多的人开始使用网络购物 网络交易 微博阅读等方式进行日常生活 然而在这样的大环境下 如何从海量的数据中提取有价值的信息并有效整合到一起成为困难重重的事情 作为一名具有高度职
  • java jsp公共异常页面_JSP页面的异常处理

    对于jsp页面错误处理这里大致有两种方式 一 在Web xml中配置全局的错误异常处理 即凡是该项目下 即虚拟路径下的所有文件 的任意一个文件错误或者异常 都会跳到指定的错误处理页面 全局的错误处理可以处理两种类型的错误 一种是HTTP代码
  • gin框架10--XML/JSON/YAML/ProtoBuf 渲染

    gin框架10 XML JSON YAML ProtoBuf 渲染 介绍 案例 说明 介绍 本文主要介绍gin 中的 XML JSON YAML ProtoBuf 等常见渲染方法 以及其测试结果 案例 源码 package main imp