欢迎大家到我的博客浏览。go的HTTP网络编程 | YinKai's Blog
go的HTTP网络编程
1、http编程--server示例
Go
package main
import (
"fmt"
"net/http"
)
func main() {
// 注册处理函数,定义 URL 路由和对应的处理函数
http.HandleFunc("/", Hello) // 根路径 "/" 的请求交给 Hello 函数处理
http.HandleFunc("/login", Login) // "/login" 路径的请求交给 Login 函数处理
// 启动 HTTP 服务器,监听指定的地址和端口
err := http.ListenAndServe("0.0.0.0:8080", nil) // 启动服务器,监听地址 "0.0.0.0:8080",使用默认的路由器和处理器
if err != nil {
fmt.Println("HTTP 服务器启动失败", err)
}
}
func Hello(w http.ResponseWriter, r *http.Request) {
// 处理根路径 "/" 的请求
fmt.Fprintf(w, "Hello, World!") // 将 "Hello, World!" 写入 http.ResponseWriter,作为 HTTP 响应的内容
}
func Login(w http.ResponseWriter, r *http.Request) {
// 处理 "/login" 路径的请求
fmt.Fprintf(w, "Login page") // 将 "Login page" 写入 http.ResponseWriter,作为 HTTP 响应的内容
}
示例说明:
http.HandleFunc("/", Hello)
:注册处理函数Hello
,将根路径 "/" 的请求交给Hello
函数处理。
http.HandleFunc("/login", Login)
:注册处理函数Login
,将 "/login" 路径的请求交给Login
函数处理。
http.ListenAndServe("0.0.0.0:8080", nil)
:启动一个 HTTP 服务器,监听地址为 "0.0.0.0:8080",传入nil
作为处理器,表示使用默认的路由器和处理器。
Hello
函数和Login
函数分别是处理根路径和 "/login" 路径请求的处理函数,它们接收一个http.ResponseWriter
和一个http.Request
参数,分别用于写入响应和读取请求信息。
fmt.Fprintf(w, ...)
:使用Fprintf
函数将字符串写入到http.ResponseWriter
中,作为 HTTP 响应的内容。
2、http编程--Client示例
Go
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
// 创建一个 HTTP 客户端
client := http.Client{}
// 构建 GET 请求
req, err := http.NewRequest("GET", "https://www.example.com", nil)
if err != nil {
fmt.Println("创建请求失败", err)
return
}
// 发送请求
res, err := client.Do(req)
if err != nil {
fmt.Println("请求失败", err)
return
}
defer res.Body.Close() // 在函数结束时关闭响应的 Body
// 读取响应的内容
data, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println("读取响应失败", err)
return
}
// 输出响应的内容
fmt.Println(string(data))
}
示例说明:
http.Client{}
:创建一个 HTTP 客户端,用于发送 HTTP 请求。
http.NewRequest("GET", "https://www.example.com", nil)
:构建一个 GET 请求,并指定请求的 URL、请求方法和请求体。
client.Do(req)
:发送请求并获取响应,返回一个http.Response
对象。
defer res.Body.Close()
:在函数结束时关闭响应的 Body,确保资源被正确释放。
ioutil.ReadAll(res.Body)
:从响应的 Body 中读取内容,返回一个字节数组。
fmt.Println(string(data))
:将读取到的响应内容转换为字符串并输出。
3、常见HTTP请求方法
GET:从服务器获取资源。客户端向服务器请求获取指定 URL 对应的资源,并从服务器返回该资源的内容。GET 请求通常用于获取数据,而不对服务器上的资源进行修改。
POST:向服务器提交数据。客户端向服务器提交数据,请求服务器对该数据进行处理。POST 请求通常用于向服务器提交数据,如表单数据、上传文件等。
PUT:更新服务器上的资源。客户端向服务器传送数据,请求服务器更新指定 URL 对应的资源。PUT 请求通常用于更新资源。
DELETE:删除服务器上的资源。客户端向服务器请求删除指定 URL 对应的资源。DELETE 请求通常用于删除资源。
HEAD:类似于 GET 请求,但只返回响应头部,不返回响应体。用于获取资源的元信息,如文件大小、文件类型等,而不获取实际的资源内容。
OPTIONS:请求服务器返回对指定 URL 支持的通信选项。服务器将返回支持的 HTTP 请求方法、头部字段等信息,用于客户端了解服务器的功能和约束。
PATCH:对服务器上的资源进行部分更新。客户端向服务器传送数据,请求服务器对指定 URL 对应的资源进行部分更新。
CONNECT:建立网络隧道。通常用于代理服务器,用于在客户端和目标服务器之间建立隧道,用于安全的加密通信。
TRACE:用于调试,请求服务器返回对请求和响应的诊断信息。不常用于实际生产环境。
4、下面是一个简单的 Go 语言程序,演示了如何使用 HTTP 请求方法进行基本的 HTTP 请求:
Go
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
// GET 请求示例
resp, err := http.Get("https://jsonplaceholder.typicode.com/posts/1") // 发起 GET 请求
if err != nil {
fmt.Println("GET 请求错误:", err)
return
}
defer resp.Body.Close() // 确保在函数退出前关闭响应体
data, err := ioutil.ReadAll(resp.Body) // 读取响应体数据
if err != nil {
fmt.Println("读取响应数据错误:", err)
return
}
fmt.Println("GET 请求响应数据:", string(data)) // 打印响应数据
// POST 请求示例
resp, err = http.Post("https://jsonplaceholder.typicode.com/posts", "application/json", nil) // 发起 POST 请求
if err != nil {
fmt.Println("POST 请求错误:", err)
return
}
defer resp.Body.Close()
data, err = ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取响应数据错误:", err)
return
}
fmt.Println("POST 请求响应数据:", string(data))
// PUT 请求示例
req, err := http.NewRequest("PUT", "https://jsonplaceholder.typicode.com/posts/1", nil) // 创建 PUT 请求
if err != nil {
fmt.Println("创建 PUT 请求错误:", err)
return
}
client := &http.Client{}
resp, err = client.Do(req) // 发起 PUT 请求
if err != nil {
fmt.Println("PUT 请求错误:", err)
return
}
defer resp.Body.Close()
data, err = ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取响应数据错误:", err)
return
}
fmt.Println("PUT 请求响应数据:", string(data))
// DELETE 请求示例
req, err = http.NewRequest("DELETE", "https://jsonplaceholder.typicode.com/posts/1", nil) // 创建 DELETE 请求
if err != nil {
fmt.Println("创建 DELETE 请求错误:", err)
return
}
resp, err = client.Do(req) // 发起 DELETE 请求
if err != nil {
fmt.Println("DELETE 请求错误:", err)
return
}
defer resp.Body.Close()
data, err = ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取响应数据错误:", err)
return
}
fmt.Println("DELETE 请求响应数据:", string(data))
}