ZBLOG

gorilla/mux 实例

以下是一个使用 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))
}

关键功能说明

  1. 动态路由
    ”`go /books/{id} //通过mux.Vars®获取参数

  2. HTTP方法限制
    ”`go .Methods(“GET”) //显式指定允许的方法

  3. 中间件链

    • loggingMiddleware:记录请求日志
    • CORSMethodMiddleware:自动处理跨域请求
  4. RESTful API设计

    • GET /books → 列表查询
    • GET /books/{id} → 单条查询
    • POST /books → 创建资源
  5. 静态文件服务
    ”`go PathPrefix(“/static/”).Handler(…)


测试方式

  1. 获取所有书籍
    ”`bash curl http://localhost:8080/books

  2. 获取单个书籍
    ”`bash curl http://localhost:8080/books/1

  3. 创建新书籍
    ”`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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24040

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?