带你用 Go 搭建一个最简单的 Web 服务了解 Golang 运行 web 的原理
Posted slowlydance2me
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带你用 Go 搭建一个最简单的 Web 服务了解 Golang 运行 web 的原理相关的知识,希望对你有一定的参考价值。
前言:
本文作为解决如何通过 Golang 来编写 Web 应用这个问题的前瞻,对 Golang 中的 Web 基础部分进行一个简单的介绍。目前 Go 拥有成熟的 Http 处理包,所以我们去编写一个做任何事情的动态 Web 程序应该是很轻松的,接下来我们就去学习了解一些关于 Web 的相关基础,了解一些概念,以及 Golang 是如何运行一个 Web 程序的。
文章预计分为四个部分逐步更新
2023-04-13 星期四 一更 全文共计约 3800 字 阅读大约花费 5 分钟
2023-04-14 星期五 二更 全文共计约 2000 字 阅读大概花费 4 分钟
文章目录:
- Web 的工作方式
- 用 Go 搭建一个最简单的 Web 服务
- 了解 Golang 运行 web 的原理
- Golang http 包详解(源码剖析)
- 总结
正文:
用 Go 搭建一个最简单的 Web 服务
在前面一节我们介绍了 Web 的工作方式,知道了 Web 是基于 HTTP 协议的一个服务, Go 语言里面提供了一个完善的 net/http 包,通过 http 包可以很方便的就搭建起来一个可以运行的 Web 服务。使用这个包也能很简单地对 Web 的路由、静态文件、模板、Cookie 等数据进行设置和操作。
-
http 包建立 Web 服务器
先贴个go代码
使用go搭建一个简单的web服务器预防跨站脚本
1.登陆页面
<html> <head> <title>login</title> </head> <body> <form action="http://127.0.0.1:9090/login" method="post"> 用户名:<input type="text" name="username"> 密码:<input type="password" name="password"> <input type="submit" value="登陆"> </form> </body> </html>
2.后端处理逻辑
package main import ( "fmt" "html/template" "log" "net/http" "strings" text_template "text/template" ) func sayhelloname(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析参数,默认是不会解析的。 fmt.Println(r.Form) fmt.Println("path:", r.URL.Path) fmt.Println("scheme:", r.URL.Scheme) fmt.Println(r.Form["url_long"]) for k, v := range r.Form { fmt.Println("key:", k) fmt.Println("value:", strings.Join(v, ",")) } fmt.Fprintf(w, "hello, welcome you!") //这个字符串写入到w中,用于返回给客户端。 } func login(w http.ResponseWriter, r *http.Request) { fmt.Println("method: ", r.Method) if r.Method == "GET" { t, _ := template.ParseFiles("login.html") t.Execute(w, nil) } else { r.ParseForm() //预防跨站脚本攻击 way := 3 if way == 1 { //将html标签进行转义 fmt.Println("方法一") fmt.Println("username: ", template.HTMLEscapeString(r.Form.Get("username"))) fmt.Println("password: ", template.HTMLEscapeString(r.Form.Get("password"))) template.HTMLEscape(w, []byte(r.Form.Get("username"))) //将转义后的用户名字段发送给客户端 } else if way == 2 { //将html标签进行转义 fmt.Println("方法二") t, err := template.New("foo").Parse(`{{define "T"}}Hello,{{.}}!{{end}}`) err = t.ExecuteTemplate(w, "T", "<script>alert(‘you have been login‘)</script>") //将一段含有脚本的内容发送给客户端 if err != nil { fmt.Println(err) } } else if way == 3 { //在编辑文章时,有时候就想在文章中加入带有html标签的代码来作为示例,那么就不能使用上面的方法进行转义。 fmt.Println("方法三") t, err := template.New("foo").Parse(`{{define "T"}}Hello,{{.}}!{{end}}`) err = t.ExecuteTemplate(w, "T", template.HTML("<script>alert(‘you have been login‘)</script>")) //将一段含有脚本的内容发送给客户端 if err != nil { fmt.Println(err) } } else { //在编辑文章时,有时候就想在文章中加入带有html标签的代码来作为示例,那么就不能使用上面的方法进行转义。 fmt.Println("方法四") t, err := text_template.New("foo").Parse(`{{define "T"}}Hello,{{.}}!{{end}}`) err = t.ExecuteTemplate(w, "T", "<script>alert(‘you have been login‘)</script>") //将一段含有脚本的内容发送给客户端 if err != nil { fmt.Println(err) } } } } func main() { http.HandleFunc("/", sayhelloname) //设置访问的路由 http.HandleFunc("/login", login) //设置访问的路由 err := http.ListenAndServe(":9090", nil) //设置监听的端口 if err != nil { log.Fatal("ListenAndServe: ", err) } }
以上是关于带你用 Go 搭建一个最简单的 Web 服务了解 Golang 运行 web 的原理的主要内容,如果未能解决你的问题,请参考以下文章
5天带你用Flink+Hologres搭建时下最火的实时数仓,免费报名!