在Go语言的net/http包中,http.HandleFunc() 函数本身并不直接支持在路由路径中捕获参数(如路径参数)。它主要用于将特定的路径模式映射到一个处理函数上,但它不支持变量路径段(如 /user/:id)
为了实现在HTTP请求路径中捕获参数(如路径参数或查询参数),你需要使用更灵活的路由库,如gorilla/mux。gorilla/mux 是一个强大的URL路由库,支持变量路由、子路由、模式匹配等功能。
1> 安装 gorilla/mux:
go get -u github.com/gorilla/mux
2> demo 代码 :
import (
// "crypto/tls"
"fmt"
// "fmt"
"flag"
"log"
"net/http"
"os"
"sync"
"github.com/gorilla/mux"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: settings.NetWork.ReadBufferSize.Value,
WriteBufferSize: settings.NetWork.WriteBufferSize.Value,
CheckOrigin: func(r *http.Request) bool { return true }, // 允许来自任何源的连接,或者根据你的需求设置
}
var addr = flag.String("addr", ":443", "http service address")
var certFile = flag.String("cert", "E:/Projects/gitee/skweb/QCRM/src/static/cert/server.crt", "SSL certificate file")
var keyFile = flag.String("key", "E:/Projects/gitee/skweb/QCRM/src/static/cert/server.key", "SSL private key file")
flag.Parse()
mr := mux.NewRouter()
mr.HandleFunc("/ws/{token}", func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
token := vars["token"]
fmt.Println("token:", token)
// 升级HTTP请求到WebSocket连接
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
fmt.Println("key: ", r.Header.Get("Sec-Websocket-Key"))
fmt.Println("subProtocol : ", ws.Subprotocol())
fmt.Println("network: ", ws.LocalAddr().Network(), ", ", ws.LocalAddr().String())
fmt.Println("remoteAddr: ", ws.RemoteAddr().Network(), ", ", ws.RemoteAddr().String())
fmt.Println("Header: ", r.Header)
fmt.Println("Host: ", r.Host)
fmt.Println("Context: ", r.Context())
fmt.Println("Form: ", r.Form)
fmt.Println("UserAgent: ", r.UserAgent())
fmt.Println("URL: ", r.URL)
username, password, ok := r.BasicAuth()
fmt.Println("username: ", username, ", password: ", password, ", ok: ", ok)
//
g_semaphore
g_waitGroup.Add(1) //计数器+1;
// 为每个连接启动一个新的goroutine
go newConn(ws)
}).Methods("GET")
// 设置HTTPS服务器
log.Fatal(http.ListenAndServeTLS(*addr, *certFile, *keyFile, mr))
客户端使用:
wss://192.168.8.131/ws/XiXiangCP001
其中 XiXiangCP001 为 token