文档章节

gin简单处理api响应数据中间件

疯狂的小企鹅
 疯狂的小企鹅
发布于 2017/03/22 21:38
字数 224
阅读 527
收藏 0

golang不像python一样。 不可以动态对c.Context做方法的扩展。看到gin.Context有一个Set, 还有一个Get可以用这来交互接口响应数据给中间件哈。

调用代码

/*
    Author        : tuxpy
    Email         : q8886888@qq.com.com
    Create time   : 2017-03-20 10:42:14
    Filename      : t.go
    Description   :
*/

package main

import (
    "gin_middlewares"

    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.New()
    router.Use(gin.Logger(), gin.Recovery(), gin_middlewares.Default(map[string]interface{}{
        "code": 200,
        "msg":  "",
    }))
    router.GET("/", func(c *gin.Context) {
        c.Set("$.data.sub.sun.aaa.bbb.ccc.name", "abc")
    })
    router.Run(":1996")
}

中间件代码

/*
	Author        : tuxpy
	Email         : q8886888@qq.com.com
	Create time   : 2017-03-22 21:14:12
	Filename      : default.go
	Description   :
*/
package gin_middlewares

import (
	"strings"

	"github.com/gin-gonic/gin"
)

func Default(resp_template map[string]interface{}) gin.HandlerFunc {
	return func(c *gin.Context) {
		c.Next()
		if c.Writer.Written() {
			return
		}

		resp := make(map[string]interface{}, len(resp_template))
		for k, v := range resp_template {
			resp[k] = v
		}

		params := c.Keys
		for name, value := range params {
			if !strings.HasPrefix(name, "$.") {
				continue
			}
			data := resp
			name = strings.TrimLeft(name, "$.")
			name_parts := strings.Split(name, ".")
			for index, name_part := range strings.Split(name, ".") {
				if index == len(name_parts)-1 {
					data[name_part] = value

				} else if _, ok := data[name_part]; !ok {
					data[name_part] = make(map[string]interface{})
					data = data[name_part].(map[string]interface{})
				}
			}
		}

		c.JSON(c.Writer.Status(), resp)

	}
}

© 著作权归作者所有

共有 人打赏支持
疯狂的小企鹅

疯狂的小企鹅

粉丝 13
博文 42
码字总数 20243
作品 6
杭州
程序员
私信 提问
Go+Vue.js快速搭建Web应用

摘要:如何实现用go和vue搭建一个简单的web应用。当然本文只是一个很初级的例子,希望这篇文章能对你有所帮助。 最近一段时间在项目中使用了go和vue,因此写下该篇文章来供大家参考。 环境准...

点融黑帮
2017/12/20
0
0
Gin-Gonic middleware theory and apply

在 Go 的世界里, web 框架简直多如牛毛. 前有自带电池的标准库(), 后有简洁优雅的 Gin-Gonic(以下简称 ), 再有全栈开发一枝花 Beego, 等等不可胜数. 使用 Go 有一段时间了, web 开发一直用的...

A Coder @ Work
2017/06/18
0
0
如何使用 Gin 和 Gorm 搭建一个简单的 API 服务器 (二)

  这是系列文章的第二篇。下面是另外两篇的链接:   如何使用 Gin 和 Gorm 搭建一个简单的 API 服务器 (一)   如何使用 Gin 和 Gorm 搭建一个简单的 API 服务器 (三) 创建 API   ...

blackpiglet
2018/03/14
0
0
如何测量并报告ASP.NET Core Web API请求的响应时间

如何测量并报告ASP.NET Core Web API请求的响应时间 介绍 大家都知道性能是API的流行语。而相应时间则是API性能的一个重要并且可测量的参数。在本文中,我们将了解如何使用代码来测量API的响...

依乐祝
2018/08/22
0
0
『No17: gin-swagger 构建自动化文档』

大家好,我叫谢伟,是一名程序员。 今天的主题:Swagger API 文档 首先问个问题, API 文档重不重要? 重要,前后端的交互一般流程是这样的,后端暴露出API后,交给前端,前端根据API的响应,...

谢小路
2018/07/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【抢购/秒杀】redis实现高并发下的抢购/秒杀功能

问题: 抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但...

echojson
25分钟前
5
0
tomcat 集群与 redis 分布式

1.学习

狼王黄师傅
27分钟前
1
0
如何正确的每天坚持背5个单词?

自从开始学习英语,我们的老师就一直告诉我们,如果每天能坚持背五个单词,一年365天就能背1800个单词初中三年,你就能背会5400个单词,背会5400个单词,就算参加高考也搓搓有余。 好吧,话是...

我是菜鸟我骄傲
36分钟前
1
0
Docker之MySql5.7中only_full_group_by的问题解决

MySql的镜像,默认情况下,MySql5.7中的sql_mode含有only_full_group_by,group by语句有时候会报错。通过手动修改sql_mode,那么如果删除容器或者新建容器,就会导致我们手动设置的sql_mod...

克虏伯
53分钟前
0
0
介绍Python中6个序列的内置类型

1、Python中6个序列的内置类型分别是什么? Python包含6中内建的序列,即列表、元组、字符串、Unicode字符串、buffer对象和 xrange 对象。序列通用的操作包括:索引、长度、组合(序列相加)...

问题终结者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部