Http编程
HTTP编程
Go语言内置的net/http包提供了HTTP客户端和服务端的实现
package main
import (
"fmt"
"net/http"
)
func main() {
//请求处理
http.HandleFunc("/hello", hello)
//端口
http.ListenAndServe("127.0.0.1:8080", nil)
}
func hello(writer http.ResponseWriter, request *http.Request) {
fmt.Println(request.URL, "====")
fmt.Println(request.Method, "====")
fmt.Println(request.RemoteAddr, "====")
fmt.Println(request.Header, "====")
fmt.Println("程序被访问到了")
//writer.Write([]byte("hello,yama"))
writer.Write([]byte("<h1>我是h1标签</h1>"))
}
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
res, _ := http.Get("http://127.0.0.1:8080/hello")
defer res.Body.Close()
buf := make([]byte, 1024)
for {
n, err := res.Body.Read(buf)
if err != nil && err != io.EOF {
fmt.Println(err)
return
} else {
fmt.Println("信息读取完毕")
fmt.Println("data:", string(buf[:n]))
break
}
}
}
带参数的请求Get
package main
import (
"fmt"
"net/http"
)
func main() {
//请求处理
http.HandleFunc("/hello", hello)
http.HandleFunc("/login", login)
//端口
http.ListenAndServe("127.0.0.1:8080", nil)
}
func login(writer http.ResponseWriter, request *http.Request) {
//获取用户传过来的数据
data := request.URL.Query()
username := data.Get("username")
password := data.Get("password")
fmt.Println("username:", username, "password:", password)
// 业务逻辑
if username == "admin" {
writer.Write([]byte(`{"登录状态":"admin"}`))
} else {
writer.Write([]byte(`{"登录状态":"失败"}`))
}
//响应信息给客户端
}
func hello(writer http.ResponseWriter, request *http.Request) {
fmt.Println(request.URL, "====")
fmt.Println(request.Method, "====")
fmt.Println(request.RemoteAddr, "====")
fmt.Println(request.Header, "====")
fmt.Println("程序被访问到了")
//writer.Write([]byte("hello,yama"))
writer.Write([]byte("<h1>我是h1标签</h1>"))
}
package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
urlStr := "http://127.0.0.1:8080/login"
data := url.Values{}
data.Set("username", "yama")
data.Set("password", "123456")
rurl, _ := url.ParseRequestURI(urlStr)
rurl.RawQuery = data.Encode()
fmt.Println(rurl.String())
//发起请求
resp, _ := http.Get(rurl.String())
b, _ := io.ReadAll(resp.Body)
fmt.Println(string(b))
}
处理前端表单数据
package main
import (
"fmt"
"net/http"
)
func main() {
//请求处理
http.HandleFunc("/hello", hello)
http.HandleFunc("/login", login)
http.HandleFunc("/register", register)
//端口
http.ListenAndServe("127.0.0.1:8080", nil)
}
func register(writer http.ResponseWriter, request *http.Request) {
request.ParseForm()
fmt.Println(request.PostForm)
username := request.PostForm.Get("username")
password := request.PostForm.Get("password")
fmt.Println("username:", username, "password:", password)
//业务逻辑
//响应信息给客户端
writer.Write([]byte(`{"status":"OK"}`))
}
func login(writer http.ResponseWriter, request *http.Request) {
//获取用户传过来的数据
data := request.URL.Query()
username := data.Get("username")
password := data.Get("password")
fmt.Println("username:", username, "password:", password)
// 业务逻辑
if username == "admin" {
writer.Write([]byte(`{"登录状态":"admin"}`))
} else {
writer.Write([]byte(`{"登录状态":"失败"}`))
}
//响应信息给客户端
}
func hello(writer http.ResponseWriter, request *http.Request) {
fmt.Println(request.URL, "====")
fmt.Println(request.Method, "====")
fmt.Println(request.RemoteAddr, "====")
fmt.Println(request.Header, "====")
fmt.Println("程序被访问到了")
//writer.Write([]byte("hello,yama"))
writer.Write([]byte("<h1>我是h1标签</h1>"))
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="http://127.0.0.1:8080/register" method="post">
<h1>注册</h1>
<p>用户名:<input type="text" name="username"></p>
<p>密码:<input type="text" name="password"></p>
<input type="submit" value="注册">
</form>
</body>
</html>
响应网页
模版文件中使用{{
和}}
包裹和标识需要传入的数据
传给模版这样的数据就可以通过点号(.)来访问,如果数据是复杂类型的数据,可以通过{{.FieldName}}来访问它的字段
除{{
和}}
包裹的内容外,其他内容均不做修改原样输出
如果要传入多个参数,一般都使用map或者struct类型
后台
package main
import (
"fmt"
"html/template"
"net/http"
)
func main() {
//请求处理
http.HandleFunc("/hello", hello)
http.HandleFunc("/login", login)
http.HandleFunc("/register", register)
//响应页面
http.HandleFunc("/temp", temp)
http.HandleFunc("/temp2", temp2)
//端口
http.ListenAndServe("127.0.0.1:8080", nil)
}
type User struct {
Name string
Age int
}
func temp2(writer http.ResponseWriter, request *http.Request) {
temp, err := template.ParseFiles("/Users/zuoliang/Documents/go/src/main/14_HTTP/05-client.html")
if err != nil {
fmt.Println(err)
return
}
userMap := make(map[int]User)
userMap[1] = User{"yama", 18}
userMap[2] = User{"jiang", 23}
userMap[3] = User{"zuo", 23}
userMap[4] = User{"zhao", 22}
//传输数据
data := make(map[string](map[int]User))
data["data"] = userMap
temp.Execute(writer, data)
}
func temp(writer http.ResponseWriter, request *http.Request) {
temp, _ := template.ParseFiles("/Users/zuoliang/Documents/go/src/main/14_HTTP/05-client.html")
//传输数据
data := make(map[string]string)
data["info"] = "hello,yama"
temp.Execute(writer, data)
}
func register(writer http.ResponseWriter, request *http.Request) {
request.ParseForm()
fmt.Println(request.PostForm)
username := request.PostForm.Get("username")
password := request.PostForm.Get("password")
fmt.Println("username:", username, "password:", password)
//业务逻辑
//响应信息给客户端
writer.Write([]byte(`{"status":"OK"}`))
}
func login(writer http.ResponseWriter, request *http.Request) {
//获取用户传过来的数据
data := request.URL.Query()
username := data.Get("username")
password := data.Get("password")
fmt.Println("username:", username, "password:", password)
// 业务逻辑
if username == "admin" {
writer.Write([]byte(`{"登录状态":"admin"}`))
} else {
writer.Write([]byte(`{"登录状态":"失败"}`))
}
//响应信息给客户端
}
func hello(writer http.ResponseWriter, request *http.Request) {
fmt.Println(request.URL, "====")
fmt.Println(request.Method, "====")
fmt.Println(request.RemoteAddr, "====")
fmt.Println(request.Header, "====")
fmt.Println("程序被访问到了")
//writer.Write([]byte("hello,yama"))
writer.Write([]byte("<h1>我是h1标签</h1>"))
}
前台
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模版渲染</title>
</head>
<body>
<h1>学习使我快乐!</h1>
<!--{{.info}}-->
{{.data}}<br>
<!--循环-->
{{range $k,$v :=.data}}
{{$k}} --- {{$v}}
<br>
{{if eq $k 1}}
{{.Name}}
{{.Age}}
{{end}}
{{end}}
</body>
</html>