golang web
因为作业原因,得学习下怎么用golang搞一个web窗口,就记录下吧,以后可能有用呢。
hello world
1 | package main |
万物起源hello world
运行之后,可以在浏览器本地的8080端口,看到打印出来的hello tunan
。
分析下上面的代码
main函数
第一句,匹配路由和处理函数
1 | http.HandleFunc("/", myWeb) |
调用http包的HandleFunc方法,匹配一个路由到一个处理函数myWeb
。
这句代码的意思是,当通过访问地址 http://localhost/ 时,就等同于调用了 myWeb 函数。
第二句,用fmt在控制台打印一句话,纯属提示,其实并没有太大的实际意义。
第三句,开启服务并且监听端口
在这句,调用了http
包中的ListenAndServe
函数,该函数有两个参数,第一个是指定监听的端口号,第二个是指定处理请求的handler,通常这个参数填nil,表示使用默认的ServeMux作为handler。
后面就是正常的错误处理了。
myweb函数
在main
函数中,用http.HandleFunc
将 myWeb
与路由/
匹配在一起。
HandleFunc
函数定义了两个参数w
,r
,参数类型分别是http.ResponseWriter
和*http.Request
,w
是响应留写入器,r
是请求对象的指针。
响应流写入器 w: 用来写入http响应数据
请求对象 * r: 包含了http请求所有信息,注意,这里使用了指针,在定义参数时用*
标记类型,说明这个参数需要的是这个类型的对象的指针。
当有请求路径/
,请求对象和响应流写入器被传递给myWeb
函数,并由myWeb
函数负责处理这次请求。
函数体
1 | fmt.Fprintln(w,seeHello()) |
这里我们使用的是fmt这个库的Fprintln和Fprintf函数,其实就是前面加了个F,把数据写入到w
响应流写入器对象。w
响应流写入器里写入的内容最后会被Response输出到用户浏览器的页面上。
至于那个seeHello函数就没什么好说的了。
获取http请求参数
1 | func myWeb(w http.ResponseWriter, r *http.Request) { |
这里我们看到我们已经在后端获取到了参数和值。
相关函数解读
http
请求的所有内容,都保存在http.Request
对象中,也就是myWeb
获得的参数 r
。所以我们的请求都需要从这个r开始。
r.ParseForm()
ParseForm解析URL中的查询字符串,并将解析结果更新到r.Form字段。如果是Post或者Put请求ParseForm还会将body当作表单解析,并将结果既更新到r.PostForm也更新到r.Form。
r.URL.Query()
和 r.PostForm
这两个分别是URL参数对象和表单参数对象,它们都是键值对值,键的类型是字符串string
,值的类型是string
数组。
这样我们就实现了最简单的交互。
动态响应数据
读取HTML模版文件,用数据替换掉对应的标签,生成完整的HTML字符串,响应给浏览器,这是所有Web开发框架的常规操作。那么golang的这个功能是什么呢
html/template
这个包就是实现这个功能的。
1 | func myWeb(w http.ResponseWriter, r *http.Request) { |
1 | index.html |
比较硬核,没办法
相关函数
template.ParseFiles
ParseFiles函数创建一个模板并解析filenames指定的文件里的模板定义。返回的模板的名字是第一个文件的文件名(不含扩展名),内容为解析后的第一个文件的内容。
Execute
Execute方法将解析好的模板应用到data上,并将输出写入w。如果执行时出现错误,会停止执行,但有可能已经写入wr部分数据。模板可以安全的并发执行。
参考