• go 1.22 增强 http.ServerMux 路由能力


    之前

    server

    func main() {
    	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    		fmt.Println("Received request:", r.URL.Path)
    		fmt.Fprintf(w, "Hello, client! You requested: %s\n", r.URL.Path)
    	})
    
    	log.Println("Server is running on http://localhost:8080")
    	if err := http.ListenAndServe(":8080", nil); err != nil {
    		log.Fatal("ListenAndServe error: ", err)
    	}
    }
    

    client

    func main() {
    	url := "http://localhost:8080/some-path"
    
    	// 创建HTTP GET请求
    	resp, err := http.Get(url)
    	if err != nil {
    		log.Fatal("HTTP GET error: ", err)
    	}
    	defer resp.Body.Close()
    
    	// 读取响应体
    	body, err := ioutil.ReadAll(resp.Body)
    	if err != nil {
    		log.Fatal("Error reading response body: ", err)
    	}
    
    	fmt.Println("Response from server:", string(body))
    }
    
    

    模式匹配优先级

    如果两个模式重叠,那么更精确的模式优先。

    如果 P1 符合 P2 请求的一个(严格)子集,P1 就比 P2 更精细
    如果两者都不更具体,那么模式就会发生冲突

    例外:
    如果两个模式发生冲突,而其中一个有 HOST ,另一个没有,那么有 HOST 的模式优先。
    在这里插入图片描述

    example.com/ 比 / 更精细
    因为第一个仅匹配主机 example.com 的请求,而第二个匹配任何请求

    GET / 比 / 更精细
    因为第一个仅匹配 GET 和 HEAD 请求,而第二个匹配任何请求

    /b/{bucket}/o/default 比 /b/{bucket}/o/{noun} 更精细
    第一个仅匹配第四个元素是文字 “default” 的路径,而在第二个中,第四个元素可以是任何内容

    匹配方法

    模式匹配将支持以 HTTP 方法开头,后跟空格,如 GET /demo 或 GET demo.com/ 中
    带有方法的模式仅用于匹配具有该方法的请求

    Go1.22 起,http.ServeMux 可以这么写:

    mux.HandleFunc("POST /demo/create", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "demo create")
    })
    
    mux.HandleFunc("GET /demo/update", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "demo update")
    })
    

    通配符

    模式匹配将支持 {name} 或 {name…}
    例如:/b/{bucket}/o/{objectname…}

    该名称必须是有效的 Go 标识符和符合完整路径元素的标准
    它们前面必须有斜杠,后面必须有斜杠或字符串末尾

    例如:/b_{bucket} 不是有效的通配模式

    Go1.22 起,http.ServeMux 可以这么写:

    mux.HandleFunc("/demo/{id}", func(w http.ResponseWriter, r *http.Request) {
        id := r.PathValue("id")
        fmt.Fprint(w, "id %s", id)
    })
    
    mux.HandleFunc("/demo/{path...}", func(w http.ResponseWriter, r *http.Request) {
        path := r.PathValue("path")
        fmt.Fprint(w, "path %s", path)
    })
    

    示例

    server

    func main() {
    	http.HandleFunc("/demo/{id}", func(w http.ResponseWriter, r *http.Request) {
    		id := r.PathValue("id")
    		fmt.Fprintf(w, "id %s\n", id)
    		fmt.Fprintf(w, "Hello, client! You requested: %s\n", r.URL.Path)
    	})
    
    	log.Println("Server is running  on /demo/x")
    	if err := http.ListenAndServe(":8080", nil); err != nil {
    		log.Fatal("ListenAndServe error: ", err)
    	}
    }
    
    

    client

    func client() {
    	url := "http://localhost:8080/demo/2?name=cucc"
    
    	// 创建HTTP GET请求
    	resp, err := http.Get(url)
    	if err != nil {
    		log.Fatal("HTTP GET error: ", err)
    	}
    	defer resp.Body.Close()
    
    	// 读取响应体
    	body, err := ioutil.ReadAll(resp.Body)
    	if err != nil {
    		log.Fatal("Error reading response body: ", err)
    	}
    
    	fmt.Println("Response from server:\n", string(body))
    }
    
  • 相关阅读:
    智慧加油站视频监控行为识别分析系统
    笔试强训第18天
    android 12动态开关USB网络共享
    【树莓派】USB摄像头+python+opencv
    图像处理:边缘检测
    ardupilot开发 ---传感器驱动,外设驱动篇
    管理多个Instagram帐户防关联小技巧大分享
    MySQL命令(命令行方式,而非图形界面方式)
    ip地址冲突导致ping时通时断显示超时问题处理过程
    Attention-based LSTM for Aspect-level Sentiment Classification
  • 原文地址:https://blog.csdn.net/wangkai6666/article/details/139755836