Go中 net/http 使用
转载请注明出处:
net/http
是Go语言标准库中的一个包,提供了实现HTTP客户端和服务器的功能。它使得编写基于HTTP协议的Web应用程序变得简单和方便。
net/http
包的主要用途包括:
-
实现HTTP客户端:可以发送HTTP请求并接收服务器的响应。
-
实现HTTP服务器:可以创建一个HTTP服务器,接受客户端的请求并返回响应
1.实现HTTP客户端
1.1发送GET请求:
package main import ( "fmt" "io/ioutil" "net/http" ) func main() { // 发送GET请求 resp, err := http.Get("https://www.baidu.com") if err != nil { fmt.Println("请求失败:", err) return } defer resp.Body.Close() // 读取响应内容 body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("读取响应失败:", err) return } fmt.Println("响应内容:", string(body)) }
上面
1.2 发送POST请求
package main import ( "fmt" "io/ioutil" "net/http" "strings" ) func main() { // POST请求数据 payload := strings.NewReader("name=John&age=30") // 发送POST请求 resp, err := http.Post("https://api.example.com/submit", "application/x-www-form-urlencoded", payload) if err != nil { fmt.Println("请求失败:", err) return } defer resp.Body.Close() // 读取响应内容 body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("读取响应失败:", err) return } fmt.Println("响应内容:", string(body)) }
package main import ( "fmt" "io/ioutil" "net/http" ) func main() { // 创建一个自定义请求 req, err := http.NewRequest("GET", "https://api.example.com/data", nil) if err != nil { fmt.Println("创建请求失败:", err) return } // 可以设置请求头部信息 req.Header.Add("Authorization", "Bearer token123") // 发送自定义请求 client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println("请求失败:", err) return } defer resp.Body.Close() // 读取响应内容 body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("读取响应失败:", err) return } fmt.Println("响应内容:", string(body)) }
上面
// 定义处理器函数 func helloHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Hello, World!") } // 注册处理器函数 http.HandleFunc("/", helloHandler) // 启动HTTP服务器 err := http.ListenAndServe(":8080", nil) if err != nil { fmt.Println("Server error:", err) }
上面定义了一个处理器函数helloHandler
,该函数对所有的HTTP请求都返回"Hello, World!"。使用http.HandleFunc
方法将处理器函数注册到根路径"/"上。然后通过http.ListenAndServe
方法启动了一个监听在端口8080的HTTP服务器。
当有客户端请求到达时,服务器会调用相应的处理器函数来处理请求并返回响应。
在net/http
中,路由是指根据不同的URL路径来匹配和执行相应的处理函数。通过路由,我们可以将不同的URL请求映射到不同的处理逻辑上。
net/http
包提供了http.HandleFunc
和http.Handle
两个方法用于注册路由处理函数。
-
http.HandleFunc
// 定义处理函数 func helloHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Hello, World!") } // 注册处理函数 http.HandleFunc("/hello", helloHandler)
上面定义了一个处理函数helloHandler
,当客户端请求路径为"/hello"时,服务器会调用该函数进行处理并返回"Hello, World!"。
// 定义自定义处理器类型 type MyHandler struct{} // 实现处理器接口的ServeHTTP方法 func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Custom Handler") } // 创建自定义处理器对象 myHandler := &MyHandler{} // 注册处理器 http.Handle("/custom", myHandler)
上面