go的HTTP网络编程

go的HTTP网络编程

1、http编程–server示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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请求方法

  1. GET:从服务器获取资源。客户端向服务器请求获取指定 URL 对应的资源,并从服务器返回该资源的内容。GET 请求通常用于获取数据,而不对服务器上的资源进行修改。
  2. POST:向服务器提交数据。客户端向服务器提交数据,请求服务器对该数据进行处理。POST 请求通常用于向服务器提交数据,如表单数据、上传文件等。
  3. PUT:更新服务器上的资源。客户端向服务器传送数据,请求服务器更新指定 URL 对应的资源。PUT 请求通常用于更新资源。
  4. DELETE:删除服务器上的资源。客户端向服务器请求删除指定 URL 对应的资源。DELETE 请求通常用于删除资源。
  5. HEAD:类似于 GET 请求,但只返回响应头部,不返回响应体。用于获取资源的元信息,如文件大小、文件类型等,而不获取实际的资源内容。
  6. OPTIONS:请求服务器返回对指定 URL 支持的通信选项。服务器将返回支持的 HTTP 请求方法、头部字段等信息,用于客户端了解服务器的功能和约束。
  7. PATCH:对服务器上的资源进行部分更新。客户端向服务器传送数据,请求服务器对指定 URL 对应的资源进行部分更新。
  8. CONNECT:建立网络隧道。通常用于代理服务器,用于在客户端和目标服务器之间建立隧道,用于安全的加密通信。
  9. TRACE:用于调试,请求服务器返回对请求和响应的诊断信息。不常用于实际生产环境。

4、下面是一个简单的 Go 语言程序,演示了如何使用 HTTP 请求方法进行基本的 HTTP 请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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))
}

go的HTTP网络编程
http://example.com/2023/04/11/Go/go的HTTP网络编程/
作者
Feng Tao
发布于
2023年4月11日
更新于
2023年4月27日
许可协议