文章

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
      }
   }
}

image-20230107181759197

带参数的请求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>
License:  CC BY 4.0 test