了解 golang 中的多路复用路由器

Posted

技术标签:

【中文标题】了解 golang 中的多路复用路由器【英文标题】:Understanding mux router in golang 【发布时间】:2016-12-14 15:50:48 【问题描述】:

这是我的代码,它试图显示在使用多路复用器之前它工作的 base64 图像。

我在使用mux之前使用过http handlefunc,这里我想使用mux并获取key的值。

package main

import (
"fmt"
"net/http"
"strconv"
base64 "encoding/base64"
"log"
"io"
    "io/ioutil"
    "os"
    "github.com/gorilla/mux"
)


var (
    Trace   *log.Logger
    Info    *log.Logger
    Warning *log.Logger
    Error   *log.Logger
)

func Init(
traceHandle io.Writer,
infoHandle io.Writer,
warningHandle io.Writer,
errorHandle io.Writer) 

    Trace = log.New(traceHandle,
        "TRACE: ",
        log.Ldate|log.Ltime|log.Lshortfile)

    Info = log.New(infoHandle,
        "INFO: ",
        log.Ldate|log.Ltime|log.Lshortfile)

    Warning = log.New(warningHandle,
        "WARNING: ",
        log.Ldate|log.Ltime|log.Lshortfile)

    Error = log.New(errorHandle,
        "ERROR: ",
        log.Ldate|log.Ltime|log.Lshortfile)


func get_info(r *http.Request)
fmt.Println(r.RemoteAddr)
fmt.Println(r.Header.Get("x-forwarded-for"))
fmt.Println(r.UserAgent())
fmt.Println(r.Referer())



func pix(w http.ResponseWriter, r *http.Request) 
    Info.Println("Hi there, I love %s!", r.URL.Path[1:])
    vars := mux.Vars(r)
    key := vars["key"]
    Info.Println("key", key)
    var cookie  *http.Cookie
    cookie , err := r.Cookie("csrftoken")
    if (err != nil )
        fmt.Printf("error")
        fmt.Println(err)
    
    get_info(r)
    fmt.Printf(cookie.Value)
    w.Header().Set("Content-Type", "image/jpeg")
    p, err := base64.StdEncoding.DecodeString("iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAADMUlEQVRYw+2YTUgUYRjHZzOJIoNA+rrUyYNIRQgRHaLo4qFDBEGeunSxS9TFU0QEnhIh6IvokrUzO2uamRmbG6XmR/mVaKZpZVbYvvO143zszsxOz+yahNm+785sITEP72F3Z+adH8/zf5+PpagwtxKXj+Vj+Vg+lo/lY+W+WI4KpddKwWIQFUSF97nNLcLGZt75SiOHchEXfskDVmYjlowpiEoei3UT2ljcFJOpOd169C1Z2SuvgsdpB7cgzB16EV/byGM2xDIVPxQujKmBDF/2m2l0vFvmEin7N2v8kiiPiOeGlGHRvP1RdxA9eYtGR7pk2Pf6lI7RCoP2RaWkZWe3fsFc18hvesAHPGEFUc24ltnx3kyiCJwfRMs6dTXLdSIjO9Osal18qzKfE5V9coDxhlU7qS3uOyiaB55JDtkS2TKoLCLaOLPS4b02pQdCHiUfRKf653/d2kjZN6f10jYxI2EnrGk5H+2WsVi6ZZ8fVSmGQKaYyyFuR6ugmUtVrJo2C7HokeGq8447sYpOPBbo3XFzKC95626sZlz905sUM9XLGbXvtKtTOhZrQDApkhNNkiAOPo/viojh2YSZsj1aF2eQ5n2stuomNQjiiGQanrFufdCXP8gu8tbhjridJ6saVPKExXJrwlwfb3pnAg2Ut0tEBZFI8gza81Tik15DCDIoINQ7aQdBo90RMfrdwNaWLFY9opJGkBQrhCA/HXspQ8W1XHkN6vfWFiGH9ouwhdpJUFuy2JX3eg6uyqENpNHZYcUd02jcLMI2WO67UwZVv1G1HLMq3L83KuEbLPdY7IL2L42p0MMQiuzkq/ncwucOi6qPbWkWoPfCUsENpweUnP1EmE4XGhgagT72RyXolkSCHBbTU3By3fgJj8VyJW3CmSHl8oTWMJuYUUizVvtcsuyJ6J4J663CMLevXar/lJgnKNSgbphzKjriTn5i0F8eX9ODXnEzf6JHvjGtv+aNGdWCOEKnJRmpr5oFVQV8WTWglIKHMlPhv5uqQ1xGYfB5fRMPo+n2VmFbi7ChiS9oWBhZvXrI01TNLg7yPxt51v9rxMfysXwsH8vH+g+wfgDUr+5LcyNV4AAAAABJRU5ErkJggg==")
    if err != nil 
        http.Error(w, "internal error", 500)
        return
    
    w.Header().Set("Content-Length", strconv.Itoa(len(p))) //len(dec)
    w.Write(p)



func main() 
    Init(ioutil.Discard, os.Stdout, os.Stdout, os.Stderr)
    Info.Println("1")
    r := mux.NewRouter()
    Info.Println("2")
    r.HandleFunc("/pix/key/pixel.gif", pix)
    err := http.ListenAndServe(":9080", nil)
    Info.Println("3")
    if err != nil 
        fmt.Println(err)
    

似乎当我打电话给http://localhost:9080/pix/2/pixel.gif 它不会调用 pix。

调用它的网址似乎正确

知道为什么吗?

问候和感谢

【问题讨论】:

【参考方案1】:

您似乎没有将r 分配给任何东西,您应该在main 的末尾添加以下内容:

http.Handle("/", r)

【讨论】:

以上是关于了解 golang 中的多路复用路由器的主要内容,如果未能解决你的问题,请参考以下文章

什么是 http 请求多路复用器?

python中的IO多路复用

计算机科学中的术语多路复用是啥意思?

Kotlin 协程协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )

IO多路复用的三种机制Select,Poll,Epoll

IO多路复用深入浅出