Go HTTP包
介绍
Go 语言的标准库中提供了一个强大的 net/http
包,用于构建 Web 服务器和处理 HTTP 请求与响应。无论是构建简单的 API 还是复杂的 Web 应用,net/http
包都能满足你的需求。本文将带你从零开始学习如何使用 Go 的 HTTP 包,并通过实际案例展示其应用。
基本概念
HTTP 服务器
在 Go 中,创建一个 HTTP 服务器非常简单。你只需要使用 http.ListenAndServe
函数,并指定监听的地址和处理请求的处理器(Handler)。
package main
import (
"fmt"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func main() {
http.HandleFunc("/", helloHandler)
http.ListenAndServe(":8080", nil)
}
在这个例子中,我们创建了一个简单的 HTTP 服务器,监听在 8080
端口。当用户访问根路径 /
时,服务器会返回 "Hello, World!"。
处理 HTTP 请求
HTTP 请求的处理是通过 http.HandlerFunc
或 http.Handler
接口来实现的。http.HandlerFunc
是一个函数类型,它接受两个参数:http.ResponseWriter
和 *http.Request
。
http.ResponseWriter
:用于向客户端发送响应。*http.Request
:包含客户端发送的请求信息。
路由
Go 的 net/http
包提供了简单的路由功能。你可以使用 http.HandleFunc
来为不同的路径注册处理函数。
http.HandleFunc("/hello", helloHandler)
http.HandleFunc("/goodbye", goodbyeHandler)
在这个例子中,/hello
路径会调用 helloHandler
,而 /goodbye
路径会调用 goodbyeHandler
。
实际案例
构建一个简单的 API
让我们构建一个简单的 API,它可以处理 GET 和 POST 请求,并返回 JSON 格式的响应。
package main
import (
"encoding/json"
"net/http"
)
type Message struct {
Text string `json:"text"`
}
func getHandler(w http.ResponseWriter, r *http.Request) {
message := Message{Text: "Hello, GET!"}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(message)
}
func postHandler(w http.ResponseWriter, r *http.Request) {
var message Message
err := json.NewDecoder(r.Body).Decode(&message)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(message)
}
func main() {
http.HandleFunc("/api/get", getHandler)
http.HandleFunc("/api/post", postHandler)
http.ListenAndServe(":8080", nil)
}
在这个例子中,我们定义了两个处理函数:getHandler
和 postHandler
。getHandler
处理 GET 请求并返回一个 JSON 对象,而 postHandler
处理 POST 请求并解析请求体中的 JSON 数据。
测试 API
你可以使用 curl
命令来测试这个 API:
# 测试 GET 请求
curl http://localhost:8080/api/get
# 测试 POST 请求
curl -X POST -H "Content-Type: application/json" -d '{"text":"Hello, POST!"}' http://localhost:8080/api/post
总结
Go 的 net/http
包为构建 Web 服务器和处理 HTTP 请求提供了强大的工具。通过本文的学习,你应该已经掌握了如何使用 net/http
包创建简单的 HTTP 服务器、处理请求和构建 API。
附加资源
练习
- 扩展上面的 API,添加一个 PUT 请求处理函数。
- 尝试使用
http.ServeMux
来管理多个路由。 - 为你的 API 添加错误处理,确保在发生错误时返回适当的 HTTP 状态码。
通过完成这些练习,你将更深入地理解 Go 的 HTTP 包,并能够构建更复杂的 Web 应用。