首页 > 编程语言 >14_Http编程

14_Http编程

时间:2023-10-08 13:22:41浏览次数:57  
标签:http 14 hs 编程 Http httprouter func router ResponseWriter

2、性能更高的第三方库 HttpRouter

https://github.com/julienschmidt/httprouter

https://pkg.go.dev/github.com/julienschmidt/httprouter

2.1 HttpRouter 与 net/http 比较

  • HttpRouter 相较于 Go语言官方库 net/http 性能更高,它支持URL中携带访问参数、支持多种访问类型(GET、POST、PUT、DELETE)。性能对比参考: https://github.com/julienschmidt/go-http-routing-benchmark

  • 精确的路径匹配。对比net/http 中的 ServeMux,ServeMux 请求的URL路径可以匹配多个模式,它有多种模式优先级规则,如最长前缀匹配、首次匹配。而 HttpRouter 对于每种URL请求路径,一个请求只能完全匹配一个或没有路由。

  • net/http 底层采用 map来存储 pattern 和 handler。而 HttpRouter 采用带有优先级节点的树状结构进行存储,对于每一种请求方式,它都维护了一棵单独的优先级树,相较于 net\http 的map存储结构而言,占用空间更小,并且在查找URL对应的Handler时速度更快。

    image-20221015140825432

2.2 嵌入中间件

2.2.1 服务于多个领域主机

​ 当前服务器有多个领域主机,实现多个领域主机都能访问到web资源。

type HostSwitch map[string]http.Handler   //定义多个主机地址到Handler的映射

func Index(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	fmt.Fprintln(w, "hello gopher!")
}

func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
	fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name"))
}

func (hs HostSwitch) ServeHTTP(w http.ResponseWriter, r *http.Request) {  //重定义ServeHTTP方法
	if handler := hs[r.Host]; handler != nil {
		handler.ServeHTTP(w, r)
	} else {
		http.Error(w, "Forbidden", 403)
	}
}

func TestHttpRouterMiddlewares(t *testing.T) {
	router := httprouter.New()
	router.GET("/", Index)
	router.GET("/hello/:name", Hello)
	//注册多host
	hs := make(HostSwitch)
	hs["example.com:12345"] = router
	hs["localhost:12345"] = router
	log.Fatal(http.ListenAndServe(":12345", hs))
}

2.2.2 基础身份验证

//闭包实现身份验证,验证参考 Basic Authentication (RFC 2617) for handles
func BasicAuth(h httprouter.Handle, requiredUser, requiredPass string) httprouter.Handle {
	return func(writer http.ResponseWriter, request *http.Request, params httprouter.Params) {
		user, password, hasAuth := request.BasicAuth()
		if hasAuth && user == requiredUser && password == requiredPass {
			h(writer, request, params)
		} else {
			writer.Header().Set("WWW-Authenticate", "Basic realm=Restricted")
			http.Error(writer, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
		}
	}
}

func Protected(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
	fmt.Fprint(w, "Protected!\n")
}

func TestHttpRouterMiddlewares2(t *testing.T) {
	user := "user"
	password := "123456"
	router := httprouter.New()
	router.GET("/", Index)
	router.GET("/protected/", BasicAuth(Protected, user, password))
	log.Fatal(http.ListenAndServe(":8080", router))
}

标签:http,14,hs,编程,Http,httprouter,func,router,ResponseWriter
From: https://www.cnblogs.com/istitches/p/17748650.html

相关文章

  • 学期2023-2024-1 20231417 《计算机基础与程序设计》第二周学习总结
    计算机科学概论第一章1.计算系统分为:软件,硬件,数据2.计算系统的层次是抽象c语言程序设计1.生如了解了什么是编程,为什么要学习编程以及怎么学习学习进度条 代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长目标5000行30篇400小时 第一周 1/1......
  • 2023-2024-20231409佟伟铭第二周学习总结
    学期2023-2024-120231409《计算机基础与程序设计》第二周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第二周作业这个作业的目标自学教材:计算机科学概论第1章并完成云班课......
  • 学期2023-2024-1 20231417 《计算机基础与程序设计》第二周学习总结
    学期2023-2024-120231417《计算机基础与程序设计》第二周学习总结教材学习内容总结《计算机科学概论》第一章:1.计算系统的分层以及计算系统的核心板块:硬件、软件、数据。2.抽象是一种思考问题的方式删除或隐藏了复杂的细节,保留实现目标所必须的信息3.计算机的四代硬件简史,......
  • 【LCD驱动】VK1C21系列是防静电/抗干扰LCD液晶显示驱动芯片,可驱动32*4/18*4/14*4点
    产品型号:VK1C21A/B产品品牌:永嘉微电/VINKA封装形式:SSOP48/LQFP48可定制裸片:DICE(COB邦定片);COG(邦定玻璃用)产品年份:新年份原厂,工程服务,技术支持! 概述:VK1C21A/B是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏,也支持2COM和3COM的LCD屏。单片机可通过......
  • CUDA C编程权威指南:2.1-CUDA编程模型
      本文主要通过例子介绍了CUDA异构编程模型,需要说明的是Grid、Block和Thread都是逻辑结构,不是物理结构。实现例子代码参考文献[2],只需要把相应章节对应的CMakeLists.txt文件拷贝到CMake项目根目录下面即可运行。1.Grid、Block和Thread间的关系  GPU中最重要的2种内存是全局......
  • 141. 环形链表
    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅仅是为了标......
  • FMC144 -八路 250MSPS 14bit AD FMC子卡
    一、板卡概述 FMC144是一款具有8通道模数转换器(ADC)的FMC卡,具有14bit分辨率,最大采样速率达250Msps。时钟配置芯片为AD9516-1,可由板载10MHz时钟提供参考,也可由外部时钟提供。FMC144采用HPC连接器,输入信号为差分对信号。FMC144基于ADS62P49,具有低功耗和高动态性能,适合于多载......
  • ansible-playbook批量安装httpd,按主机名提供不同的index.html(如node1的index.html欢迎
    [root@ansible~]#vim/etc/ansible/hosts[webservers]10.0.0.150ansible_connection=local10.0.0.160#创建角色相关目录[root@ansiblehtml]#mkdir-pv/data/ansible/roles/httpd/{tasks,handlers,files}mkdir:createddirectory'/data/ansible'mkdir:crea......
  • 2023-2024-1 20231413 《计算机基础与程序设计》第二周学习总结
    班级:2023-2024-1-计算机基础与程序设计作业要求:2023-2024-1《计算机基础与程序设计》教学进程目标:自学教材:计算机科学概论第1章并完成云班课测试《C语言程序设计》第1章并完成云班课测试教材学习内容总结:再次阅读了《计算机科学概论》第1章,更加了解了计算机与计算系统;对C语......
  • 2023-2024-1 20231314《计算机基础与程序设计》第2周学习总结
    2023-2024-120231314《计算机基础与程序设计》第2周学习总结作业信息这个作业属于哪个课程<班级的链接>((https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP))这个作业要求在哪里(2022-2023-1计算机基础与程序设计第二周作业)这个作业的目标《计算机科学概论......