Hello,我是普通Gopher,00后男孩,极致的共享主义者,想要成为一个终身学习者。专注于做最通俗易懂的计算机基础知识类公众号。每天推送Golang技术干货,内容起于K8S而不止于K8S,涉及Docker、微服务、DevOps、数据库、虚拟化等云计算内容及SRE经验总结
=======================
初次见面,我为你准备了100G学习大礼包:
1、《百余本最新计算机电子图书》
2、《30G Golang学习视频》
3、《20G Java学习视频》
4、《90G Liunx高级学习视频》
5、《10G 算法(含蓝桥杯真题)学习视频》
6、《英语四级,周杰伦歌曲免费送!》
路过麻烦动动小手,点个关注,持续更新技术文章与资料!
1. HTTP编程
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", Hello)
http.HandleFunc("/usr/login", login)
http.HandleFunc("/usr/history", history)
err := http.ListenAndServe("0.0.0.0:8880", nil)
if err != nil {
fmt.Println("http listen failed")
}
}
func Hello(w http.ResponseWriter, r *http.Request) {
fmt.Println("handle hello")
_, _ = fmt.Fprintf(w, "hello !")
}
func login(w http.ResponseWriter, r *http.Request) {
fmt.Println("handle login")
_, _ = fmt.Fprintf(w, "hello login !")
}
func history(w http.ResponseWriter, r *http.Request) {
fmt.Println("handle history")
_, _ = fmt.Fprintf(w, "hello history!")
}
打开浏览器访问本地的8880端口(因为我这里设置的是8880端口)
2. HTTP Client
package demo2
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
res, err := http.Get("https://www.baidu.com")
if err != nil {
fmt.Println("get err", err)
}
data, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println("data err", err)
return
}
fmt.Println(string(data))
}
以GET
请求访问百度, 返回的网页信息
3. 表单处理
package main
import (
"io"
"net/http"
)
// 定义Html页面的显示表单
const form = `
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>产品添加-产品管理系统</title>
</head>
<body>
<h3>产品管理表单</h3>
<form action="#" method="post">
图书名称:<input type='text' name='title' />
<hr />
销售价格:<input type="text" name='price' />
<hr />
市场价格:<input type="text" name='market_price' />
<hr />
<input type="submit" name="submit" value="添加" />
<input type="reset" name="reset" value="重置" />
</form>
</body>
</html>
`
func formServer(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set("Content-Type", "text/html")
switch request.Method {
case "GET": // 直接访问时为GET请求
_, _ = io.WriteString(writer, form)
case "POST": // 提交表单为POST请求
_ = request.ParseForm()
_, _ = io.WriteString(writer, "title = ")
_, _ = io.WriteString(writer, request.Form["title"][0]+"\n")
_, _ = io.WriteString(writer, "price = ")
_, _ = io.WriteString(writer, request.Form["price"][0]+"\n")
_, _ = io.WriteString(writer, "market_price = ")
_, _ = io.WriteString(writer, request.Form["market_price"][0]+"\n")
}
}
func simpleServer(writer http.ResponseWriter, request *http.Request) {
_, _ = io.WriteString(writer, "<h1>Hello ! This is test1")
}
func main() {
http.HandleFunc("/test1", simpleServer) // localhost:8880/test1 访问simpleServer定义的页面
http.HandleFunc("/test2", formServer) // localhost:8880/test2 访问formServer定义的页面
if err := http.ListenAndServe("0.0.0.0:8880", nil); err != nil {
}
}
http://localhost:8880/test1
可以访问到设置的test1页面
http://localhost:8880/test2
可以访问到设置的test2页面
提交表单会返回输入的值
4. 捕获Panic错误处理
package main
import (
"io"
"log"
"net/http"
)
// 定义Html页面的显示表单
const form = `
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>产品添加-产品管理系统</title>
</head>
<body>
<h3>产品管理表单</h3>
<form action="#" method="post">
图书名称:<input type='text' name='title' />
<hr />
销售价格:<input type="text" name='price' />
<hr />
市场价格:<input type="text" name='market_price' />
<hr />
<input type="submit" name="submit" value="添加" />
<input type="reset" name="reset" value="重置" />
</form>
</body>
</html>
`
func formServer(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set("Content-Type", "text/html")
switch request.Method {
case "GET": // 直接访问时为GET请求
_, _ = io.WriteString(writer, form)
case "POST": // 提交表单为POST请求
_ = request.ParseForm()
_, _ = io.WriteString(writer, "title = ")
_, _ = io.WriteString(writer, request.Form["title"][0]+"\n")
_, _ = io.WriteString(writer, "price = ")
_, _ = io.WriteString(writer, request.Form["price"][0]+"\n")
_, _ = io.WriteString(writer, "market_price = ")
_, _ = io.WriteString(writer, request.Form["market_price"][0]+"\n")
}
}
func simpleServer(writer http.ResponseWriter, request *http.Request) {
_, _ = io.WriteString(writer, "<h1>Hello ! This is test1")
panic("This is a panic test !")
}
func logPanics(handle http.HandlerFunc) http.HandlerFunc {
return func(writer http.ResponseWriter, request *http.Request) {
defer func() {
if x := recover(); x!=nil{
log.Printf("[%v] caught panic: %v",request.RemoteAddr, x)
}
}()
handle(writer, request)
}
}
func main() {
http.HandleFunc("/test1", logPanics(simpleServer)) // localhost:8880/test1 访问simpleServer定义的页面
http.HandleFunc("/test2", logPanics(formServer)) // localhost:8880/test2 访问formServer定义的页面
if err := http.ListenAndServe("0.0.0.0:8880", nil); err != nil {
}
}
该Demo
添加了panic
处理函数logPanics
, 可以在终端查看捕获的Panic信息
5. 调用模板网页
package main
import (
"fmt"
"html/template"
"os"
)
type Person struct {
Name string
Age string
}
func main() {
t, err := template.ParseFiles("E:/Go/Golang_Studycode/src/demoCode/domo5/index.html") // index.html路径
if err != nil {
fmt.Println(" Parse file err:", err)
return
}
p := Person{Name:"Jack", Age:"20"}
if err := t.Execute(os.Stdout, p); err != nil{
fmt.Println("There was an erros:",err.Error())
}
}
index.php
<html>
<head>
<title>This is a test</title>
</head>
<body>
<p> this is a test!</p>
<p> Hello {{.Name}} , you age is {{.Age}}</p>
</body>
</html>