以下是一个使用 Gorilla/mux 路由库的完整 Go 语言示例,包含常见的路由配置、中间件和 RESTful API 实现:
1. 安装 Gorilla/mux
go get -u github.com/gorilla/mux
2. 基础示例代码
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"time"
"github.com/gorilla/mux"
)
// 定义数据结构
type Book struct {
ID string `json:"id"`
Title string `json:"title"`
Author string `json:"author"`
}
var books = []Book{
{ID: "1", Title: "Go Programming", Author: "John Doe"},
{ID: "2", Title: "Advanced Go", Author: "Jane Smith"},
}
// 日志中间件
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("[%s] %s %s", time.Now().Format("2006-01-02 15:04:05"), r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
// GET /books - 获取所有书籍
func getBooks(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(books)
}
// GET /books/{id} - 获取单个书籍
func getBook(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
params := mux.Vars(r)
for _, item := range books {
if item.ID == params["id"] {
json.NewEncoder(w).Encode(item)
return
}
}
w.WriteHeader(http.StatusNotFound)
fmt.Fprintf(w, `{"error": "Book not found"}`)
}
// POST /books - 创建新书籍
func createBook(w http.ResponseWriter, r *http.Request) {
var book Book
if err := json.NewDecoder(r.Body).Decode(&book); err != nil {
w.WriteHeader(http.StatusBadRequest)
fmt.Fprintf(w, `{"error": "Invalid request body"}`)
return
}
books = append(books, book)
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(book)
}
func main() {
r := mux.NewRouter()
// 静态文件服务(可选)
r.PathPrefix("/static/").Handler(
http.StripPrefix("/static/",
http.FileServer(http.Dir("./static")),
)
// API路由配置
r.HandleFunc("/books", getBooks).Methods("GET")
r.HandleFunc("/books/{id}", getBook).Methods("GET")
r.HandleFunc("/books", createBook).Methods("POST")
// CORS中间件(可选)
r.Use(mux.CORSMethodMiddleware(r))
r.Use(loggingMiddleware)
// 启动服务器
log.Println("Server started on :8080")
log.Fatal(http.ListenAndServe(":8080", r))
}
关键功能说明
动态路由
”`go /books/{id} //通过mux.Vars®获取参数HTTP方法限制
”`go .Methods(“GET”) //显式指定允许的方法中间件链
loggingMiddleware
:记录请求日志
CORSMethodMiddleware
:自动处理跨域请求
RESTful API设计
- GET
/books
→ 列表查询
- GET
/books/{id}
→ 单条查询
- POST
/books
→ 创建资源
- GET
静态文件服务
”`go PathPrefix(“/static/”).Handler(…)
测试方式
获取所有书籍
”`bash curl http://localhost:8080/books获取单个书籍
”`bash curl http://localhost:8080/books/1创建新书籍
”`bash curl -X POST -H “Content-Type: application/json”
-d ‘{“id”:“3”,“title”:“New Book”,“author”:“Anonymous”}’
http://localhost:8080/books
进阶用法
- 子路由分组:用
PathPrefix()
+Subrouter()
- 正则匹配:如限制ID为数字:
/{id:[0-9]+}
- Query参数解析:结合
r.URL.Query().Get("key")
需要更复杂的例子可以告诉我具体场景!
内容由零声教学AI助手提供,问题来源于学员提问