http.FileServer静态文件服务处理器和模板引擎使用

首先它是一个处理器,其次它何以指定目录上的请求路径动态解析,读取文件流,把流转为字符串交给text/template去解析,或者读取的是有格式的html文件,交给html/template去解析,并写入响应流中,如下:

Go 复制代码
	// 访问路径http://localhost:8080/static/static/file
	// http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
	filesHandler := http.FileServer(http.Dir("./public"))
	//路由静态文件路径上必须加上/,表示后面有动态目录下文件,加前缀在服务文件目录下查找目录和匹配文件
	http.DefaultServeMux.Handle("/static/", http.StripPrefix("/static/", filesHandler))
	// http.Handle("/", loggingHandler(http.HandlerFunc(handle))) //接收函数类型的handle的实现者,先转为函数类型在自动转为接口
	http.HandleFunc("/addCookies", addCookies)
	fmt.Println("服务已启动")
	http.ListenAndServe(":8080", nil)

如上注意点是在文件的路由地址上往往忽略掉/static/最后一个/与其他的路由地址不同,它会向后继续匹配到基础服务的文件目录,加上目录的前缀 访问文件。

模板引擎html/template和text/template的使用差不多,前者处理格式文本内容和模板语法内容结合,后者处理模板文本内容,转化显示,工作量要少一些。template.ParseFiles解析多模板,柱模版负责展示,辅助模板负责局部引入渲染,使用ts.ExecuteTemplate(w, "index", nil)时要指定核心模板,如果找不到模板名就会不处理,模板名定义在解析的渲染文件中{{define "index"}}{{end}}

如果不用模板名就使用ts.Execute(w,nil)它会加载第一个文件处理,想以模板引擎的语法引入局部的模板还是要解析到辅助模板名,这样使用方便,之间可以共享变量,否则只能像传统引入静态http文件,在统一的上下文渲染后端的值。

Go 复制代码
// 先获取请求的cookie的信息
	cookie, err := r.Cookie("firest_ck") //两种方式读一种是根据key读一个根据对象头信息直接都、读所有
	ck2 := r.Header["Cookie"]            //获取请求头的信息
	fmt.Println(ck2)
	if err == nil {
		fmt.Println(cookie)
	}

	// 创建内置的符合浏览器的cookie的结构体
	c1 := http.Cookie{Name: "first_ck", Value: "session_id:123", HttpOnly: true}
	c2 := http.Cookie{Name: "second_ck", Value: "session_id:123", HttpOnly: true}
	w.Header().Set("Set-Cookie", c1.String())
	w.Header().Add("Set-cookie", c2.String())
	http.SetCookie(w, &c1) //第二种方式设置响应体的cookie(目前响应头有三个)
	// 模板解析有两种方式1 单模板的传参解析文件2多模板多文件的解析
	// 不同点多模块模板需要严格对模块解析,单模板只需要解析
	ts := template.Must(template.ParseFiles("./public/static/index.html"))
	//指定一个核心模板其他为辅助做布局,必须提供有效模板名
	// 如果没有就用ts.Execute(w,nil)指定第一个文件为核心
	ts.ExecuteTemplate(w, "index", nil)
	// ts.Execute(w,nil)
	// http.Redirect(w, r, "http://www.baidu.com", 302) //永久重定向
相关推荐
2501_916007474 小时前
抓包工具功能对比,TraceEagle、Charles、Fiddler、Wireshark、mitmproxy 差别
前端·网络协议·ios·adb·https·fiddler·wireshark
靠coding维持生计的potato8 小时前
从HTTP到存储——文件上传的底层原理梳理
http
FungLeo8 小时前
成为全栈·Go 后端篇·跨语言认证兼容:Node 与 Go 如何互认 JWT 和密码
golang·go·jwt·身份认证·成为全栈·bcrypt
2501_915106329 小时前
Windows 上开发 Unity iOS,使用 KXBuild 进行真机调试、性能采样与打包 ipa
windows·vscode·unity·ios·个人开发·swift·敏捷流程
柚鸥ASO优化11 小时前
iOS 27.2 更新后,App Store 广告展示逻辑出现新变化
ios
美狐美颜SDK开放平台12 小时前
视频美颜SDK如何应对快速转头与大幅度面部动作?
android·人工智能·ios·音视频·直播美颜sdk·视频美颜sdk
茶底世界之下12 小时前
秋叶已经够黄了:用 Awaking 单独收一点黄色
ios
紧跟先前的步伐12 小时前
Go AI Agent 实战 19|工具定义、参数 Schema 与工具注册表
人工智能·ai·golang·1024程序员节
FungLeo13 小时前
成为全栈·Go 后端篇·重写之前先锁基线:契约、Node 版本与行为清单
golang·node.js·go·openapi·契约测试·成为全栈