Iris搭建路由模块controller+审计中间件

Iris搭建路由模块controller+审计中间件

  1. 封装NewControllerRoute方法:iris_demo/route/route.go
  2. 封住NewSignRoute方法,添加自定义中间件:iris_demo/util/route_util.go
  3. 自定义中间件:iris_demo/middleware/audittrail_middleware.go、iris_demo/middleware/signature_middleware.go
  4. 定义通用返回值:iris_demo/response/response.go
  5. 封装baseController,通用controller方法:iris_demo/controller/base_controller.go
  6. 定义业务controller:iris_demo/controller/user_controller.go
  7. main方法中初始化controllers:initControllers

完整代码:
https://github.com/ziyifast/ziyifast-code_instruction/tree/main/iris_demo

项目整体结构:
在这里插入图片描述

1 定义route/route.go:NewControllerRoute

iris_demo/route/route.go

package routeimport ("github.com/kataras/iris/v12/context"
)var ControllerList = make([]*ControllerRoute, 0)type ControllerRoute struct {RouteName       stringControllerObj   interface{}ServiceSlice    []interface{}MiddlewareSlice []context.HandlerDoneHandleSlice []context.Handler
}func NewControllerRoute(routeName string, controller interface{}, middlewares []context.Handler, doneHandle []context.Handler) {route := &ControllerRoute{RouteName:       routeName,ControllerObj:   controller,MiddlewareSlice: middlewares,DoneHandleSlice: doneHandle,}ControllerList = append(ControllerList, route)
}

2 定义util/route_util.go:NewSignRoute

定义签名路由:iris_demo/util/route_util.go

package utilimport ("github.com/kataras/iris/v12/context""myTest/demo_home/blom_filter/middleware""myTest/demo_home/blom_filter/route"
)func NewSignRoute(prefix, routeName string, controllerVar interface{}, extraHandler ...context.Handler) {middleWares := []context.Handler{middleware.SignatureMiddleware}if len(extraHandler) > 0 {middleWares = append(middleWares, extraHandler...)}doneHandler := []context.Handler{middleware.AuditTrailMiddleware}route.NewControllerRoute(prefix+routeName, controllerVar, middleWares, doneHandler)
}

3 定义中间件middleware:用于验签、审计等

自定义中间件:i

  • ris_demo/middleware/audittrail_middleware.go
  • iris_demo/middleware/signature_middleware.go

ris_demo/middleware/audittrail_middleware.go:

package middlewareimport ("github.com/kataras/iris/v12""github.com/ziyifast/log"
)func AuditTrailMiddleware(ctx iris.Context) {log.Infof("audit trail ....")ctx.Next()
}

iris_demo/middleware/signature_middleware.go:

package middlewareimport ("github.com/kataras/iris/v12""github.com/ziyifast/log"
)func SignatureMiddleware(ctx iris.Context) {log.Infof("SignatureMiddleware...do some signature check")ctx.Next()
}

4 定义通用返回值:response.go

iris_demo/response/response.go

package responsetype Code stringvar (ReturnCodeError   Code = "0"ReturnCodeSuccess Code = "1"SuccessMsg             = "success"SuccessStatus          = "success"FailedStatus           = "failed"ContentTypeJson = "application/json"
)type JsonResponse struct {Code    Code        `json:"code"`Msg     string      `json:"msg"`Content interface{} `json:"data"`
}

5 封装baseController,通用controller方法

封装baseController,通用controller方法:iris_demo/controller/base_controller.go

package controllerimport ("encoding/json""github.com/kataras/iris/v12""github.com/kataras/iris/v12/mvc""github.com/ziyifast/log""myTest/demo_home/iris_demo/response""net/http""strconv"
)type BaseController struct {Ctx iris.Context
}func (c *BaseController) Param(paraName string) string {return c.Ctx.Params().Get(paraName)
}func (c *BaseController) ParamInt64Default(paramName string, defaultValue int64) int64 {return c.Ctx.Params().GetInt64Default(paramName, defaultValue)
}
func (c *BaseController) ParamInt64(paramName string) (int64, error) {return c.Ctx.Params().GetInt64(paramName)
}
func (c *BaseController) ParamInt32Default(paramName string, defaultValue int32) int32 {return c.Ctx.Params().GetInt32Default(paramName, defaultValue)
}
func (c *BaseController) ParamInt32(paramName string) (int32, error) {return c.Ctx.Params().GetInt32(paramName)
}
func (c *BaseController) ParamIntDefault(paramName string, defaultValue int) int {return c.Ctx.Params().GetIntDefault(paramName, defaultValue)
}
func (c *BaseController) ParamInt(paramName string) (int, error) {return c.Ctx.Params().GetInt(paramName)
}func (c *BaseController) ReadParamJson(paramName string, result interface{}) error {paramJson := c.Ctx.FormValue(paramName)if err := json.Unmarshal([]byte(paramJson), result); err != nil {log.Errorf("unmarshal request param[%s] fail, param body [%v] error [%v]", paramName, paramJson, err)return err}return nil
}func (c *BaseController) GetIntFormValue(key string, defaultValue int) int {value := c.Ctx.FormValue(key)if len(value) == 0 {return defaultValue}atoi, err := strconv.Atoi(value)if err != nil {return defaultValue}return atoi
}func (c *BaseController) Message(responseCode response.Code, msg string, content interface{}) mvc.Result {return commonResp(msg, http.StatusOK, responseCode, content)
}
func (c *BaseController) Ok(content interface{}) mvc.Result {return commonResp(response.SuccessMsg, http.StatusOK, response.ReturnCodeSuccess, content)
}func (c *BaseController) OkWithMsg(str string, args ...interface{}) mvc.Result {return commonResp(response.SuccessMsg, http.StatusOK, response.ReturnCodeSuccess, nil)
}func (c *BaseController) Failed(errMsg string, args ...interface{}) mvc.Result {return commonResp(errMsg, http.StatusInternalServerError, response.ReturnCodeError, nil)
}func (c *BaseController) Forbidden() mvc.Result {return commonResp(http.StatusText(http.StatusForbidden), http.StatusForbidden, response.ReturnCodeError, nil)
}func (c *BaseController) BadRequest() mvc.Result {return commonResp(http.StatusText(http.StatusBadRequest), http.StatusBadRequest, response.ReturnCodeError, nil)
}func (c *BaseController) BadRequestWithMsg(errMsg string) mvc.Result {return commonResp(errMsg, http.StatusBadRequest, response.ReturnCodeError, nil)
}func (c *BaseController) SystemInternalError() mvc.Result {return commonResp(http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError, response.ReturnCodeError, nil)
}func (c *BaseController) Unauthorized() mvc.Result {return commonResp(http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized, response.ReturnCodeError, nil)
}func (c *BaseController) SystemInternalErrorWithMsg(errMsg string) mvc.Result {return commonResp(errMsg, http.StatusInternalServerError, response.ReturnCodeError, nil)
}func (c *BaseController) NotFoundError() mvc.Result {return commonResp(http.StatusText(http.StatusNotFound), http.StatusNotFound, response.ReturnCodeError, nil)
}func (c *BaseController) TooManyRequestError() mvc.Result {return commonResp(http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests, response.ReturnCodeError, nil)
}func commonResp(errMsg string, httpCode int, returnCode response.Code, content interface{}) mvc.Response {payload := &response.JsonResponse{Code:    returnCode,Msg:     errMsg,Content: content,}contentDetail, err := json.Marshal(payload)if err != nil {log.Errorf("marshal json response error %v", err)}return mvc.Response{Code:        httpCode,Content:     contentDetail,ContentType: response.ContentTypeJson,}
}

6 定义业务Controller:UserController等

定义业务controller:iris_demo/controller/user_controller.go

package controllerimport ("github.com/kataras/iris/v12/mvc""github.com/ziyifast/log""net/http"
)type UserController struct {BaseController
}func (c *UserController) BeforeActivation(b mvc.BeforeActivation) {b.Handle(http.MethodGet, "/smoke", "Smoke")
}func (c *UserController) Smoke() mvc.Result {log.Infof("user controller")defer c.Ctx.Next()return c.Ok("smoke")
}

7 启动iris:initControllers

iris_demo/main.go

package mainimport ("github.com/aobco/log""github.com/kataras/iris/v12""github.com/kataras/iris/v12/mvc""github.com/kataras/iris/v12/sessions""myTest/demo_home/iris_demo/controller""myTest/demo_home/iris_demo/route""myTest/demo_home/iris_demo/util""time"
)var (signaturePrefix = "/yi/anon/"SessionMgr      *sessions.Sessions
)func main() {InitControllers()app := iris.New()initMvcHandle(app)app.Listen(":8899")
}
func initSession() {sessionCfg := sessions.Config{Cookie:  "test",Expires: time.Duration(60) * time.Minute,}SessionMgr = sessions.New(sessionCfg)
}func initMvcHandle(app *iris.Application) {initSession()for _, v := range route.ControllerList {log.Debugf("routeName:%s middleware:%v  doneHandler:%v", v.RouteName, v.MiddlewareSlice, v.DoneHandleSlice)myMvc := mvc.New(app.Party(v.RouteName))myMvc.Router.Use(v.MiddlewareSlice...)myMvc.Router.Done(v.DoneHandleSlice...)myMvc.Register(SessionMgr.Start)myMvc.Handle(v.ControllerObj)}
}func InitControllers() {util.NewSignRoute(signaturePrefix, "user", new(controller.UserController))
}

效果

启动程序,浏览器访问:http://localhost:8899/yi/sign/user/smoke

  • 根据我们注册的路由来拼接:prefix+routeName+path
    在这里插入图片描述

可以看到是:验签 - 业务逻辑 - 审计追踪

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/518048.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络】:再谈传输层(UDP)

传输层 一.再谈端口号二.UDP 一.再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序。 在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看); 1.端口号划分 0 - 1023:…

【MybatisPlus】BaseMapper详解,举例说明

一、BaseMapper 简介 MyBatis-Plus 的核心类 BaseMapper 主要是用于提供基本的 CRUD(创建、读取、更新、删除)操作的接口定义。它是 MyBatis-Plus 框架中的一个重要组成部分,可以大大简化基于 MyBatis 的数据访问层代码的编写。 BaseMapper…

【Python爬虫实战】抓取省市级城市常务会议内容

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…

Unity:Animation 三 Playable、ImportModel

目录​​​​​​​ 1. Playables API 1.1 Playable vs Animation 1.2 Advantages of using the Playables API 1.3 PlayableGraph Visualizer 2. Creating models outside of Unity 2.1 Preparing your model files for export 2.1.1 Scaling factors 2.1.2 优化模型文…

streamlit学习-如何修改css样式

streamlit学习-如何修改css样式 效果图代码(srv.py)运行streamlit默认的样式有时并不符合自己的要求。比如手机上的布局太浪费空间,我们希望一屏能放下所有的元素,本文演示了如何操作 效果图 代码(srv.py) import streamlit as st #1.31.1 import cv2 import numpy as np imp…

python词嵌入

一、词嵌入的概念 自然语言处理的突破在2023年震撼世界,chatgpt3出来,之后chatgpt4、Gemini、Claude3等出来,问答越来越智能,非常厉害,其中有个基础性的概念,计算机要如何理解语言,基础工作就在…

ORACLE 如何使用dblink实现跨库访问

dbLink是简称,全称是databaselink。database link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表及执行远程程序。在任何分布式环境里,database都是必要的。另外要注意的是database link是单向的连接。在创建dat…

Nmap的基本操作

1 目标规格 nmap 192.168.1.1 扫描一个IP nmap 192.168.1.1 192.168.2.1 扫描IP段 nmap 192.168.1.1-254 扫描一个范围 nmap nmap.org 扫描一个域名 nmap 192.168.1.0/24 使用CIDR表示法扫描 …

ChatGPT高效提问——说明提示技巧

ChatGPT高效提问——说明提示技巧 现在,让我们开始体验“说明提示技巧”(IPT, Instructions Prompt Technique)和如何用它生成来自ChatGPT的高质量的文本。说明提示技巧是一个通过向ChatGPT提供需要依据的具体的模型的说明来指导ChatGPT输出…

uniapp模仿下拉框实现文字联想功能 - uniapp输入联想(官方样式-附源码)

一、效果 废话不多说&#xff0c;上效果图&#xff1a; 在下方的&#xff1a; 在上方的&#xff1a; 二、源码 一般是个输入框&#xff0c;输入关键词&#xff0c;下拉一个搜索列表。 ElementUI有提供<el-autocomplete>&#xff0c;但uniapp官网没提供这么细&#x…

什么是芯片胶水?它的作用是什么?

什么是芯片胶水&#xff1f; 芯片胶水是电子领域关键的材料&#xff0c;一种用于电子主板上芯片封装的胶水&#xff0c;主要用于电子设备制造过程中的芯片固定与封装环节。 芯片胶水的作用是什么? 在PCBA制程工艺中&#xff0c;芯片胶水被用于将芯片与底座或电路板紧密地固定…

chatGPT的耳朵!OpenAI的开源语音识别AI:Whisper !

语音识别是通用人工智能的重要一环&#xff01;可以说是AI的耳朵&#xff01; 它可以让机器理解人类的语音&#xff0c;并将其转换为文本或其他形式的输出。 语音识别的应用场景非常广泛&#xff0c;比如智能助理、语音搜索、语音翻译、语音输入等等。 然而&#xff0c;语音…