跳到主要内容

Go HTTP包

介绍

Go 语言的标准库中提供了一个强大的 net/http 包,用于构建 Web 服务器和处理 HTTP 请求与响应。无论是构建简单的 API 还是复杂的 Web 应用,net/http 包都能满足你的需求。本文将带你从零开始学习如何使用 Go 的 HTTP 包,并通过实际案例展示其应用。

基本概念

HTTP 服务器

在 Go 中,创建一个 HTTP 服务器非常简单。你只需要使用 http.ListenAndServe 函数,并指定监听的地址和处理请求的处理器(Handler)。

go
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.HandlerFunchttp.Handler 接口来实现的。http.HandlerFunc 是一个函数类型,它接受两个参数:http.ResponseWriter*http.Request

  • http.ResponseWriter:用于向客户端发送响应。
  • *http.Request:包含客户端发送的请求信息。

路由

Go 的 net/http 包提供了简单的路由功能。你可以使用 http.HandleFunc 来为不同的路径注册处理函数。

go
http.HandleFunc("/hello", helloHandler)
http.HandleFunc("/goodbye", goodbyeHandler)

在这个例子中,/hello 路径会调用 helloHandler,而 /goodbye 路径会调用 goodbyeHandler

实际案例

构建一个简单的 API

让我们构建一个简单的 API,它可以处理 GET 和 POST 请求,并返回 JSON 格式的响应。

go
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)
}

在这个例子中,我们定义了两个处理函数:getHandlerpostHandlergetHandler 处理 GET 请求并返回一个 JSON 对象,而 postHandler 处理 POST 请求并解析请求体中的 JSON 数据。

测试 API

你可以使用 curl 命令来测试这个 API:

bash
# 测试 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。

附加资源

练习

  1. 扩展上面的 API,添加一个 PUT 请求处理函数。
  2. 尝试使用 http.ServeMux 来管理多个路由。
  3. 为你的 API 添加错误处理,确保在发生错误时返回适当的 HTTP 状态码。

通过完成这些练习,你将更深入地理解 Go 的 HTTP 包,并能够构建更复杂的 Web 应用。