Golang - restful-url的接口注册处理

2023-11-09

一、注册 /根请求转到rootHandle,在rootHandle中为不同的url查找对应的处理接口并执行。

1、tars业务端配置restful url与处理函数,指定url与对应的处理函数。

    type TarsHttpMux struct {
        http.ServeMux
        cfg *TarsHttpConf
    }
    mux := &tars.TarsHttpMux{}
    mux.HandleFunc("/", model.RootHandler)

2、这种方法在注册时把所有的url请求转到rootHandle中进行处理,在业务端rootHandle要实现为不同的url转到不同的接口进行处理的逻辑。rootHandle包含以下逻辑。

var handlers = make(map[string]Handler)
// Handler ...
type Handler interface {
	HandleFunc(req string) (interface{}, int, error)
}
//入参handle的接口实现者不同,处理url的逻辑不同
func RegisterHandler(url string, h Handler) error {
	_, ok := handlers[url]
	if ok {
		return errors.New("Url handle func alread registed")
	}

	handlers[url] = h
	return nil
}

RegisterHandler("/test", &test)

func GetHandler(url string) (Handler, error) {
	p, ok := handlers[url]
	if ok {
		return p, nil
	}
	return nil, errors.New("Get Url handle func failed")
}
 
GetHandler("test").HandleFunc(req)

3、 mux.HandleFunc("/", model.RootHandler) 调用net/http包的处理函数,注册url与自定义func RootHandler(w http.ResponseWriter, r*http.Request) 处理函数 。

// HandleFunc registers the handler function for the given pattern.
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
	if handler == nil {
		panic("http: nil handler")
	}
	mux.Handle(pattern, HandlerFunc(handler))
}

4、若通过HandleFunc接口注册,需要适配函数类型为Handler接口。即含有ServeHTTP方法。HandlerFunc为一个函数类型,实现了ServeHTTP的方法,是一个Handle接口类型。

// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.

type Handler interface {
	ServeHTTP(ResponseWriter, *Request)
}

type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
	f(w, r)
}

5. 注册url的处理入口函数

// Handle registers the handler for the given pattern.
// If a handler already exists for pattern, Handle panics.
func (mux *ServeMux) Handle(pattern string, handler Handler) {
	mux.mu.Lock()
	defer mux.mu.Unlock()

	if pattern == "" {
		panic("http: invalid pattern")
	}
	if handler == nil {
		panic("http: nil handler")
	}
	if _, exist := mux.m[pattern]; exist {
		panic("http: multiple registrations for " + pattern)
	}

	if mux.m == nil {
		mux.m = make(map[string]muxEntry)
	}
	e := muxEntry{h: handler, pattern: pattern}
	mux.m[pattern] = e
	if pattern[len(pattern)-1] == '/' {
		mux.es = appendSorted(mux.es, e)
	}

	if pattern[0] != '/' {
		mux.hosts = true
	}
}

二、在http/net中为不同的restful-url请求注册不同的接口

1、tars业务端配置restful url与处理函数,指定url与对应的处理函数。

    type TarsHttpMux struct {
        http.ServeMux
        cfg *TarsHttpConf
    }
    // AdminMux admin http处理对象
	var AdminMux *tars.TarsHttpMux = &tars.TarsHttpMux{}

2、业务端定义httphandle结构体,结构体中的成员为接口类型成员,传入结构体接口成员的实现者不同,结构体拥有不同的处理逻辑。 由于 IHandler为httpHandle的匿名类型成员,所以httpHandle结构体可以直接调用HandleFunc接口,即实现了IHandler接口方法,httpHandle结构体也为IHandle接口类型。若想要某一结构体拥有某一接口不同的实现方法时,可以把接口类型作为结构体的一个类型成员。接口成员赋予不同的实现者时,结构体拥有不同的接口实现方法

	type httpHandler struct {
        IHandler
    }
	type IHandler interface {
		HandleFunc(url string, req []byte) (interface{}, int, error)
	}

3、同时业务端httpHandler结构体实现了serverhttp方法,为所有的url通用的处理方法逻辑,不同的处理逻辑在于调用httpHandler.HandleFunc()时。此结构体可为net/http中的Handle接口类型。 不同的url请求对应不同的httpHandle结构体进行处理。

    func (h *httpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
     //所有的url通用的处理方法逻辑,不同的处理逻辑在于调用httpHandler.HandleFunc()时

    }

4、业务端调用RegisterURLHandler接口为不同的url绑定不同的处理接口IHandler,在业务端为所有的url和相应的处理接口,最终执行net/http包中handle接口进行注册。入参Ihandle的接口实现者不同,httpHandle调用的HandleFunc函数逻辑不同,即处理pattern url的逻辑不同。

	func RegisterURLHandler(pattern string, handler IHandler) {
		h := &httpHandler{handler}
		AdminMux.Handle(pattern, h)
	}


5、执行net/http包中handle接口,注册url的处理入口函数

// Handle registers the handler for the given pattern.
// If a handler already exists for pattern, Handle panics.
func (mux *ServeMux) Handle(pattern string, handler Handler) {
	mux.mu.Lock()
	defer mux.mu.Unlock()

	if pattern == "" {
		panic("http: invalid pattern")
	}
	if handler == nil {
		panic("http: nil handler")
	}
	if _, exist := mux.m[pattern]; exist {
		panic("http: multiple registrations for " + pattern)
	}

	if mux.m == nil {
		mux.m = make(map[string]muxEntry)
	}
	e := muxEntry{h: handler, pattern: pattern}
	mux.m[pattern] = e
	if pattern[len(pattern)-1] == '/' {
		mux.es = appendSorted(mux.es, e)
	}

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

Golang - restful-url的接口注册处理 的相关文章

随机推荐

  • 毕业设计-基于深度卷积神经网络的焊缝图像滤波系统

    目录 前言 课题背景和意义 实现技术思路 一 优化网络结构 二 WIF CNN的建立与训练 三 结果与讨论 四 总结 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业
  • 【前端】Vue项目:旅游App-(10)city:以indexBar的形式显示数据

    文章目录 目标 过程与代码 分析数据并展示 封装到一个组件 添加indexBar 样式修改 优化tab栏的切换 效果 总代码 修改或新增的文件 common css city vue currentGroupCity vue main js
  • 主线程和子线程结束的关系

    一 Main线程是个非守护线程 不能设置成守护线程 原因 main线程是由java虚拟机在启动的时候创建的 main方法开始执行的时候 主线程已经创建好并在运行了 对于运行中的线程 调用Thread setDaemon 会抛出异常Excep
  • 推荐:互联网思维必读十本书

    最近在商界最流行的词汇 莫过于 互联网思维 了 互联网思维 就像一部让人垂涎的武林秘籍 得之可化腐朽为神奇 无论是小米 阿芙精油 或是卖煎饼的黄太吉 都宣称自己用互联网思维取得了巨大的胜利 那 互联网思维 究竟是什么呢 有人认为互联网思维就
  • WebRTC音视频通话-iOS端调用ossrs直播拉流

    WebRTC音视频通话 iOS端调用ossrs直播拉流 之前实现iOS端调用ossrs服务 文中提到了推流 没有写拉流流程 所以会用到文中的WebRTCClient 请详细查看 https blog csdn net gloryFlow a
  • openstack排错

    创建云主机失败 neutron agent list 计算节点服务没起来 实际是起来的 观察时间有问题 同步时间 root compute ntpdate controller 再看控制节点 起来了 也能创建云主机了
  • 配置HUE 遇到Error in sasl_client_start (-4) SASL(-4): no mechanism available: No worthy mechs found

    错误 Error in sasl client start 4 SASL 4 no mechanism available No worthy mechs found 解决方法 yum install cyrus sasl plain cy
  • c语言中typedef和define的区别

    define是宏替换 编译后代码中不存在 define u8 uint 8 意味着程序中所有u8被替换为uint 8 在最终代码中根本不会存在u8这个符号 只有uint 8这个符号 typedef 是用来定义一种类型的新别名的 它不同于宏
  • Linux搭建服务器之六:安装kafka

    windows安装kafka 请点击 https blog csdn net weixin 44039105 article details 129240685 spm 1001 2014 3001 5502 安装jdk https blo
  • 关于STM32串口烧录后程序正常运行,但是掉电或复位后程序不正常运行的可能解决方法。

    关于STM32串口烧录后程序正常运行 但是掉电或复位后程序不正常运行的可能解决方法 BOOT0 BOOT1 MODE 0 X FLASH 1 1 SRAM 1 0 ISP BOOT0置1 BOOT1置0 开启串口烧录模式 用FlyMcu烧录
  • 回首2021,展望2022

    律回春晖渐 万象始更新 2022年的曙光即将照射到这片平畴沃野 在这辞旧迎新的时刻 观成科技祝大家 新年快乐 吉祥如意 2021年 对于网络安全行业来说又是不平凡的一年 疫情反复 网络安全事件频发 网络安全的攻防对抗烈度和重视程度都达到了一
  • 区块链入门二:区块不可篡改

    区块链入门一 什么是区块链 在上一篇中 简单介绍了什么是区块链 这一篇主要介绍区块链的不可篡改的特性 首先我们来了解下哈希 Hash 算法 这是百度的描述 简单来说就是一种不可逆的摘要算法 哈希算法的目的就是为了验证原始数据是否被篡改 常用
  • 【满分】【华为OD机试真题2023 JAVA&JS】字母组合

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 字母组合 知识点回溯 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 每个数字对应多个字母 对应关系如下 0 a b c 1 d e f 2 g h i 3 j
  • vue面试题汇总

    HTML篇 CSS篇 JS篇 TypeScript篇 React篇 微信小程序篇 前端面试题汇总大全 含答案超详细 HTML JS CSS汇总篇 持续更新 前端面试题汇总大全二 含答案超详细 Vue TypeScript React 微信小
  • MySQL索引底层:B+树详解

    前言 当我们发现SQL执行很慢的时候 自然而然想到的就是加索引 对于范围查询 索引的底层结构就是B 树 今天我们一起来学习一下B 树哈 Mysql有什么索引 索引模型是什么 树简介 树种类 B 树 B 树简介 B 树插入 B 树查找 B 树
  • python3 清除过滤emoji表情

    前段时间发现了一个 人工智能学习网站 通俗易懂 风趣幽默 分享一下给大家 学习链接 python3 清除过滤emoji表情 第一种方法 使用emoji处理库 安装emoji 使用 import emoji test str 服务周到 性价比
  • 汇编语言(王爽第三版)实验二

    实验二 题目预览 使用Debug 将下面的程序段写入程序 逐条进行 根据指令执行后的实际运行情况填空 仔细观察图3 19中的实验过程 然后分析 为什么2000 0 2000 F中的内容会发生改变 1 使用Debug 将下面的程序段写入程序
  • 目标跟踪整理(1)之MOSSE

    之前读过一遍MOSSE了 读完还是有一种懵懵的感觉 最近还需要入基于相关滤波的目标跟踪的坑 所以又屁颠屁颠跑来深入理解一下 毕竟是相关滤波的始祖啊 Visual Object Tracking using Adaptive Correlat
  • SpringMVC学习(一)——快速搭建SpringMVC开发环境(非注解方式)

    目录 1 开发环境准备 1 1 首先电脑需要安装JDK环境 略 1 2 准备一个以供开发的tomcat 1 3 准备Maven工具 1 4 准备IDE编译器 1 5 准备一个本地的数据库 2 搭建SpringMVC开发环境 2 1 创建we
  • Golang - restful-url的接口注册处理

    一 注册 根请求转到rootHandle 在rootHandle中为不同的url查找对应的处理接口并执行 1 tars业务端配置restful url与处理函数 指定url与对应的处理函数 type TarsHttpMux struct h