iris实现reponse拦截返回客户端消息_iris 请求拦截-csdn博客


本站和网页 https://blog.csdn.net/zjcjava/article/details/88753397 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Iris实现reponse拦截返回客户端消息_iris 请求拦截-CSDN博客
Iris实现reponse拦截返回客户端消息
最新推荐文章于 2023-05-15 22:02:50 发布
牧竹子 阅读量2.3k 收藏 点赞数 分类专栏: go 文章标签: iris 拦截器
版权声明:本文为博主原创文章,遵循
CC 4.0 BY-SA
版权协议,转载请附上原文出处链接和本声明。
本文链接:
https://blog.csdn.net/zjcjava/article/details/88753397
版权
专栏收录该内容
8 篇文章
1 订阅
订阅专栏
基本思路要求
2019/3/22 22:54晚间终于走通了大致的拦截流程。
项目需求,由于项目国际化需要,本公司所有系统翻译配置信息使用集中集群方式配置在apollo配置中心里面,最好的方式当然是吧所有的状态码都统一在路由层处理,但是同事实测nginx+lua解析服务返回json严重影响路由效率,因此java项目和go项目都统一使用自身拦截器处理,降低业务层逻辑的耦合。
java spirng boot项目的拦截器很丰富,也很容易实现,问题是go使用的这个框架iris查看源码所有的返回客户端的消息直接io.write写回去,并且其本身并没有提供responseHand的相关接口。因此处理参考文章末尾写了一半的源码解析,只能自己再别写边改。
思路如下:
返回客户端的数据主要有write,wrietString,JSON,JSONP,这几种类型,当然还有文件留之类的的,这里我们并不考虑此内容,本文也不做拦截。
熟悉源码之后可以发现,整个底层都是使用go自身的http.server和io实现的,只是在上面包装了一层,我们这里也只着重关注包装的router和context这两个类和方法,它们才是http交互的关键。因为http.Hander接口它赋值的是app.Router所以Route是进行请求和回写客户端的关键。所有的htttp请求都会使用router.mainHandler进行处理,该方法会通过HandleRequest(ctx)找到系统启动时注册的url和对应的处理方法名,使用该方法处理。
router.mainHandler = func(w http.ResponseWriter, r *http.Request) {
ctx := cPool.Acquire(w, r)
router.requestHandler.HandleRequest(ctx) //主要http请求入口
cPool.Release(ctx)
参数ctx则附带了大量http请求的url,参数等上下文信息,
同时也是通过url找到对应处理方法后的主要入口ctx.Do
(n.Handlers)
n := t.search(path, ctx.Params())
if n != nil {
ctx.SetCurrentRouteName(n.RouteName)
ctx.Do(n.Handlers) //调用对应的方法进行处理
// found
return
看到这里你应该明白了,所有的Controler中都会带上它的值contex,当然也包括上面说的给客户的回写消息,主要靠的也是它的实现接口,通过每个回写的方法拦截器中回调我们自己实现的具体拦截业务即可起到拦截内容后返回给它们继续后续处理的问题。而我们自己实现的具体拦截器当然最好是统一一个地方处理,在contex中各个write,JSON等方法统一处理即可,这样改写代码很少便可以实现拦截。
而go语言可以使用反射实现方法回调,因此实现起来还是很简单的。
http.server
Handler:{ServeHTTP(ResponseWriter, *Request)}这里既是实现了该接口的Application.Router
Application
*router.APIBuilder
*router.Router 实现了http.Handler接口
ContextPool *context.Pool 里面存放系统变量
新建 (route,Usercontroller)
ControllerActivator
router: url methond(fullpack,name)
value:
未完待续,后面我会加上更多内容:
本文作者:bamboo
email:zjcjava@163.com
具体修改方法
修改route.go方法
type Router struct {
MyHand interface{} // 新增自定义字段
// the important
ctx.ResponseHandler(router.MyHand)//添加我的拦截器
router.requestHandler.HandleRequest(ctx)
修改context.go方法
type Context interface {
ResponseHandler(o interface{})//给context赋值方法
type context struct {
//新增自定义拦截器字段
HandResponseWriter interface{}
// 实现该接口
func (ctx *context) ResponseHandler(o interface{}) {
ctx.HandResponseWriter =
// 自定义拦截器调用该自定义字段,通过方法名反射找到方法
// ResponseWriter returns an http.ResponseWriter compatible response writer, as expected.
func (ctx *context) HandResponse(str string) string {
fmt.Println("----------HandResponse拦截START-----------------------------")
if ctx.HandResponseWriter!=nil {
//ctx.HandResponseWriter.HandResponseWriter(str)
o := ctx.HandResponseWriter
t := reflect.ValueOf(o)
//反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息
mv := t.MethodByName("HandResponseWriter")
args := []reflect.Value{reflect.ValueOf(str)}
rs :=mv.Call(args)
str =rs[0].Interface().(string)
fmt.Println(str)
fmt.Println("----------HandResponse拦截END-----------------------------")
return str
//使用IO之前先调用拦截方法
func (ctx *context) Write(rawBody []byte) (int, error) {
rawBody = []byte(ctx.HandResponse(string(rawBody)))
return ctx.writer.Write(rawBody)
// Writef formats according to a format specifier and writes to the response.
//
// Returns the number of bytes written and any write error encountered.
func (ctx *context) Writef(format string, a ...interface{}) (n int, err error) {
return ctx.writer.Writef(format, a...)
// WriteString writes a simple string to the response.
func (ctx *context) WriteString(body string) (n int, err error) {
body = ctx.HandResponse(body)
return ctx.writer.WriteString(body)
// JSON marshals the given interface object and writes the JSON response to the client.
func (ctx *context) JSON(v interface{}, opts ...JSON) (n int, err error) {
options := DefaultJSONOptions
if len(opts) > 0 {
options = opts[0]
ctx.ContentType(ContentJSONHeaderValue)
if options.StreamingJSON {
if ctx.shouldOptimize() {
var jsoniterConfig = jsoniter.Config{
EscapeHTML:
!options.UnescapeHTML,
IndentionStep: 4,
}.Froze()
enc := jsoniterConfig.NewEncoder(ctx.writer)
err = enc.Encode(v)
} else {
enc := json.NewEncoder(ctx.writer)
enc.SetEscapeHTML(!options.UnescapeHTML)
enc.SetIndent(options.Prefix, options.Indent)
if err != nil {
ctx.StatusCode(http.StatusInternalServerError) // it handles the fallback to normal mode here which also removes the gzip headers.
return 0, err
return ctx.writer.Written(), err
jsonStr, err := json.Marshal(v)
fmt.Println("json err: ", err)
//转成json字符串 调用拦截方法
str :=ctx.HandResponse(string(jsonStr));
json.Unmarshal([]byte(str), v) // 调用完成解析成原对象中
n, err = WriteJSON(ctx.writer, v, options, ctx.shouldOptimize())
ctx.StatusCode(http.StatusInternalServerError)
return n, err
使用
package routers
import "fmt"
type
MyHand struct {
func (ctx MyHand) HandResponseWriter(str string) string {
fmt.Println("----------MyHand-----------------------------")
// 检查字符串是否符合基本的json格式
if( strings.HasPrefix(str, "{") && strings.HasSuffix(str, "}")){
// 字符串转JSON
var obj interface{}
err := json.Unmarshal([]byte(str), &obj)
fmt.Println(err)
objMap := obj.(map[string]interface{}) //转成Map
code:=objMap["code"]
fmt.Println("状态码是:",code)
json, err := json.Marshal(objMap)// 转回JSON
//str=`{"code":"0000","msg":"失败","data":{"stat":"bamboo"}}`
str=string(json)
str
给app.Router.MyHand赋值
myHand := MyHand{}
app.Router.MyHand=myHand
参考资料
Iris框架源码阅读和分析
https://www.cnblogs.com/rabbix/p/10332845.html
优惠劵
关注
点赞
觉得还不错?
一键收藏
知道了
评论
基本思路要求2019/3/22 22:54晚间终于走通了大致的拦截流程。项目需求,由于项目国际化需要,本公司所有系统翻译配置信息使用集中集群方式配置在apollo配置中心里面,最好的方式当然是吧所有的状态码都统一在路由层处理,但是同事实测nginx+lua解析服务返回json严重影响路由效率,因此java项目和go项目都统一使用自身拦截器处理,降低业务层逻辑的耦合。java spirng b...
复制链接
扫一扫
专栏目录
TensorFlow
实现
数据集线性回归
09-20
主要介绍了TensorFlow
数据集线性回归,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
基础配置篇:博客的
中间件配置
no_reg的博客
12-12
755
中间件的意思是,我们运行博客后,用户访问一个链接,程序会最终执行这个链接对应的控制器。在执行控制器里面的代码之前运行的其他代码,我们就叫做中间件。比如常用到的中间件有:authorization权限判断,logger访问日志,cors跨域处理options
请求
等。这些中间件有做
拦截
的,有做旁路的等等功能。
我们要制作的博客,同样需要使用到中间件功能,我们的博客设计中用到的功能有管理员权限判断、cors判断等。
cors跨域处理options
options叫做预检
,就是查看是否可以或者允许跨域
参与评论
您还未登录,请先
登录
后发表或查看评论
附:
IRIS
JSON使用示例
m0_62389521的博客
02-26
106
SpringMVC学习
qq_44296442的博客
09-02
70
SpringMVC项目配置步骤
(1)add Framework support… 选中web项目
(2)配置tomcat服务器,添加一个artifact
(3)WEB-INF下新建lib目录放入相关jar包
(4)加载jar包:Project Structure -> Libraries -> 加一个lib选中项目目录下对应lib位置(记得选中对应项目)
(5)在src下粘贴springmvc.xml文件,修改其中需要扫描的包(属性base-package)
(6)在web -> WEB
web框架:
Iris
快速入门
最新发布
weixin_45565886的博客
05-15
1603
在log中打印
信息和
返回
结果 方便调试
情怀中的释然~
10-24
3714
这个框架相关的资料太少,进行任何封装操作都只能点进去看源码进行操作,总结了下打印日志信息的方式,留给有需要的人
大致思路
1、将每次
的数据保存在ctx的values中
2、自定义日志中间件,每次
done之后调用中间件
3、在日志中间件中打印
数据
将每次
import (
"xiaoge/src/core"
// Test...
SVM支持向量机,
二分类问题
06-16
matlab程序+数据集(预处理完成的)
BP算法-matlab
数据集
09-03
实验中,采用
分类数据进行测试。其中共有4种特征,3种类别。设置的网络参数为输入层为4(特征数),隐藏层设置了1层。神经元个数为8,输出层为3(类别数),激活函数采用的是sigmoid函数。训练的时候设置的mini_...
-lua:Lua 的
客户端
07-07
鸢尾花推介会中继协议
。警告这尚未在实际系统中使用。 如果您想尝试一下,请尝试,但请谨慎操作并报告您发现的错误。依赖关系
本身只依赖 LuaSocket。 您将需要来运行测试套件。用法查看examples目录和...
kmeans
数据集分类
08-15
框架:keras,语言:python,使用算法:k-means,需要安装一些安装包
JavaWeb核心技术——Response响应
成功在于坚持!
03-30
4416
目录
1,Response对象
1.1 Response设置响应数据功能介绍
1.2 Respones
重定向
1.2.1 Response重定向(redirect):一种资源跳转方式。
1.2.2 重定向的
方式:
1.2.3重定向的特点
1.3 路径问题
1.4 Response响应字符数据
1.5Response响应字节数据
前面讲解完Request对象,接下来我们回到刚开始的那张图:
Request:使用request对象来获取请..
Response的用法
热门推荐
lingxing9454的博客
09-17
4万+
1. 设置响应行的状态码
setStatus(int value)
response.setStatus(302);
2.设置响应头
addHeader(String name,String value)
addIntHeader(String name,int value)
addDateHeader(String name,long value)
...
框架的处理post/get
qq_43109978的博客
04-29
2401
处理post
添加商品
前端v
<form action="/product/add"
method="post" >
<label class="col-sm-3 control-label">商品名称</label>
<div class="col-sm-6">
<input type="text" class=...
关于Request与Response,你所必须掌握的,都在这儿了
JunsIr的技术栈
04-25
1760
本文承接自
Servlet概念-原理-操作[Java-web]
在学习Request和Response之前,你最好先学习Servlet
文章目录关于Request与Response,你所必须掌握的,都在这儿了doGet与doPost相对路径与绝对路径相对路径访问servlet绝对路径访问ServletTomcat
响应流程Ht...
项目中 http响应
jiao512的专栏
07-03
1361
// 超时时间axios.defaults.timeout = 5000;// http
axios.interceptors.request.use(config => {    // MintUI Loading方法    // Indicator.open();    return config;}, error => {    // Indicator.close();...
干货|Golang
的一种
中兴开发者社区
11-29
1万+
点击上方“中兴开发者社区”,关注我们
每天读一篇一线开发者原创好文
前言
说起
,大家一定会想起Java语言。
Java里的
是动态
Action调用的对象,它提供了一种机制使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Prog
golang
mvc controller出现reflect异常
zhnxin_163的博客
05-30
853
开发十年,就只剩下这套Java开发体系了
>>>   
微服务框架_golang web框架_完整示例Demo
yinjl123456的博客
01-28
2601
简介
是一款Go语言中用来开发web应用的框架,该框架支持编写一次并在任何地方以最小的机器功率运行,如Android、ios、Linux和Windows等。该框架只需要一个可执行的服务就可以在平台上运行了。
框架以简单而强大的api而被开发者所熟悉。
除了为开发者提供非常简单的访问方式外,还同样支持MVC。另外,用
构建微服务也很容易。
框架的官方网站上,被称为速度最快的Go后端开发框架。在
的网站文档上,列出了该框架具备的一些特点和框架特性,列举如下:
决策树
分类
04-30
好的,下面我将介绍如何使用决策树算法来
分类。
首先需要导入相关的库和数据集:
```python from sklearn.datasets import load_
from sklearn.tree import DecisionTreeClassifier from sklearn....
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
CSDN认证博客专家
CSDN认证企业博客
码龄14年
暂无认证
212
原创
周排名
7200
总排名
132万+
访问
等级
8993
积分
485
粉丝
670
获赞
261
2837
私信
热门文章
SpringBoot使用Nacos作为配置中心服务和服务注册中心
229058
SpringBoot自动配置的原理及实现以及SpringBoot3.0的变化
121277
Logstash常用配置和日志解析
79998
JMM概述
62509
Springboot实现filter拦截token验证和跨域
51529
分类专栏
BPM
1篇
数据仓库
数据库
19篇
数据库工具
redis
13篇
elasticsearch
17篇
flink
MongodDB
2篇
solr
3篇
分布式
spring-cloud
16篇
分布式任务
dubbo
RPC
PowerDesigner
日志工具
K8S
9篇
docker
12篇
SSO
scala
c/c++
java
14篇
个人
15篇
android
5篇
编码风格
hadoop
Linux
python
FastDFS
nginx
7篇
java笔记
24篇
spring
4篇
算法
JVM
springboot
18篇
jquery
6篇
git
gitlab
架构设计
centos
设计模式
IDE
vue
zookeeper
MQ
8篇
通识
blockchain
Jenkins
微信小程序
最新评论
centos系统虚拟机安装和服务配置初始化
CSDN-Ada助手:
哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性;(2)使用更多的站内链接。
Nginx 配置反向代理 WebSocket
默o。:
文章写的很详细,条理清晰,很容易看进去,
学到了很多知识,感谢博主分享,
支持博主.希望博主也支持我的博客,一起进步
windows11安装docker desktop和K8S环境创建镜像和运行dashboard
牧竹子:
第一个是系统管理员授权可以启动wsl服务,第二个是启动服务,它们两个命令确实是一模一样,我当时执行都没注意到这个一模一样的哈哈,感谢指正
Gin+Gorm+MySql 搭建web脚手架
设置公开已经完成
现在好像默认都被系统设置为私有了 我去改改哈
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
最新文章
服务网格Service Mesh和Istio
kettle spoon创建带参数定时任务并关闭它
CentOS 8最小安装和网络配置
2024年
2023年
21篇
2022年
2021年
2020年
2019年
83篇
2018年
36篇
2017年
79篇
2015年
2012年
2011年
被折叠的 
 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
红包个数最小为10个
红包总金额
红包金额最低5元
余额支付
当前余额
3.43
前往充值 >
需支付:
10.00
取消
确定
下一步
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值