day17 網路程式設計

染指未来發表於2024-07-03

go 開啟一個 web 服務

  • net 包,所有有關網路的都在net包下
package main

import (
	"fmt"
	"net/http"
)

// 需要傳入 :ResponseWriter, *Request
func hello(rw http.ResponseWriter, request *http.Request) {
	fmt.Println("已經收到請求")
	fmt.Println("請求地址:", request.Host)
	fmt.Println("請求介面:", request.URL)
	fmt.Println("請求方法:", request.Method)

	// 響應
	rw.Write([]byte("hello go web!你好 go web"))
}
func main() {
	/* net 包 */
	/* 手動開啟一個 http 的服務*/
	http.HandleFunc("/hello", hello)
	//
	http.ListenAndServe(":8080", nil)
}

普通Server/Client 通訊

server
package main

import (
	"fmt"
	"net/http"
)

func hello1(response http.ResponseWriter, req *http.Request) {
	// - 請求
	fmt.Println("【request URL】:", req.URL)
	fmt.Println("【request Header】:", req.Header)
	fmt.Println("【request Host】:", req.Host)
	fmt.Println("【request Method】:", req.Method)
	// - 響應
	response.Write([]byte("<H1 style='color:red'>colorcolorcolor</H1>"))
}
func main() {
	/*
		go 中的所有網路相關的。都在net包下,http也在net包下
			- 包含 服務端 和 客戶端
	*/

	// http  處理請求的方法
	http.HandleFunc("/hello", hello1)
	// 地址,處理器。 預設最後一行
	http.ListenAndServe("localhost:8080", nil)

}

client
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {

	/* go 傳送請求並獲取響應 */

	//1.傳送請求
	//response, _ := http.Get("http://localhost:8080/hello")
	response, _ := http.Get("http://www.baidu.com")
	//2.延時關閉 請求連結
	defer response.Body.Close()

	//3.迴圈 讀取body裡的資料
	data := make([]byte, 1024)
	for {
		n, err := response.Body.Read(data)
		fmt.Println(n, err)
		// 當 err 資訊 :不等於nig 並且 不為 EOF 時表示還沒讀完
		if err != nil && err != io.EOF { // 沒錯誤,繼續讀取,有錯誤另外處理
			fmt.Println(">>>>>>>讀取時,產生其他錯誤:", err)
			return
		} else {
			fmt.Println("讀取中!!!")
			fmt.Println(string(data[:n]))
			if n == 0 {
				fmt.Println("讀取完畢!!!")
				break
			}
		}
	}

}

帶引數Server/Client 通訊

server
package main

import (
	"fmt"
	"net/http"
)

func login(w http.ResponseWriter, r *http.Request) {
	fmt.Println("【進入login】")

	// 1. 設定 模擬 db map資料
	dbUserInfo := map[string]string{"username": "admin", "password": "123456"}

	//2. 讀取請求引數
	requestData := r.URL.Query()

	//3. 獲取請求引數資料
	username := requestData.Get("username")
	password := requestData.Get("password")

	//4. 判斷是否能夠登陸
	if dbUserInfo["username"] == username && dbUserInfo["password"] == password {
		w.Write([]byte(`{"code":200,"data":{"username":"admin","password":"123456"}}`))

	} else {
		w.Write([]byte(`{"code":400,"data":{}}`))
	}

}
func main() {
	/* 模擬登陸 */

	http.HandleFunc("/login", login)
	http.ListenAndServe("localhost:9999", nil)
}

client
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
)

func main() {

	//1. 設定 請求地址
	requestUrl := "http://localhost:9999/login"

	//2. 封裝引數 透過 http url包
	requestData := url.Values{}
	requestData.Set("username", "admin")
	requestData.Set("password", "123456")

	//3. 拼接引數到 請求地址上
	urlUri, _ := url.ParseRequestURI(requestUrl)
	urlUri.RawQuery = requestData.Encode()

	// 4. 傳送請求
	res, _ := http.Get(urlUri.String())

	// 5. 處理請求結果
	responseData, _ := ioutil.ReadAll(res.Body)
	fmt.Println(res.StatusCode)
	fmt.Println(res.Header)
	fmt.Println(res.ContentLength)
	fmt.Println("請求結果:", string(responseData))

}

表單Server/Client 通訊

server
package main

import (
	"fmt"
	"net/http"
)

func register(writer http.ResponseWriter, request *http.Request) {

	// 1. 獲取表單資料
	request.ParseForm()             // 解析頁面表單
	requestData := request.PostForm // 獲取表單資料
	username := requestData.Get("username")
	password := requestData.Get("password")
	fmt.Println(">>>requestData", requestData)
	fmt.Println(">>>username", username, ">>>password", password)

	writer.Write([]byte("註冊成功!"))

}

func main() {
	/* form 表單資料 提交到後臺。 即 post 請求攜帶資料 */

	// 1. 註冊處理函式
	http.HandleFunc("/register", register)
	// 2. 開啟監聽服務
	http.ListenAndServe(":8080", nil)
}

client
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<H1>登錄檔單</H1>
<form action="http://127.0.0.1:8080/register" method="post">
    <p>賬戶:<input type="text" name="username" id="username"></p>
    <p>密碼:<input type="password" name="password" id="password"></p>
    <button type="submit">提交</button>
</form>

</body>
</html>

go 返回 template 模板 不常用,比python的模板還難用!!!

Server
package main

import (
	"fmt"
	"html/template"
	"net/http"
)

type User struct {
	username string
	age      int
	Name     string
}

func userFunc(w http.ResponseWriter, r *http.Request) {

	// 1. 組裝 map巢狀結構體 資料
	userMap := make(map[int]User)
	userMap[0] = User{age: 18, username: "zhangsan", Name: "aaa"}
	userMap[1] = User{age: 22, username: "lisi", Name: "bbb"}
	// 2. 資料返回給模板
	templatePath := "userList.html"
	userListTemplate, err := template.ParseFiles(templatePath)
	if err != nil {

		fmt.Println("模板解析錯誤!!")
		return
	}
	templateData := make(map[string]map[int]User)
	templateData["data"] = userMap
	userListTemplate.Execute(w, templateData)

}
func main() {

	/* go 的template 使用 */

	// 1. 註冊路由和函式
	http.HandleFunc("/user", userFunc)
	// 2. 開啟監聽服務
	http.ListenAndServe(":8080", nil)

}

Client
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!-- 不分離 給頁面傳輸資料  -->
<p>{{.data}}</p>
{{range $k,$v:= .data}}
<p>ID:{{$k}}</p>
<br>
<p>userInfo:{{$v}}</p>
<br>

<p>判斷</p>
    {{if eq $k 1}}
        <p>Name:{{.Name}}</p>
    <br>
    <!--小寫的不可展示-->
        <p>username:{{.username}}</p>
    <br>
        <p>V:{{$v}}</p>
    {{end}}
{{end}}
</body>
</html>

request 內部

相關文章