Поместите http.NewServeMux в http.NewServeMux - PullRequest
0 голосов
/ 25 мая 2018

Это мой код.Я хочу поставить mux1 в качестве дополнительного маршрутизатора в mux.Handle.Далее я запускаю код.Я могу посетить путь / индекс, но я не могу посетить путь / индекс / sub1.Я не знаю, почему я могу посетить / индексировать, но я не могу посетить / index / sub1?

package main

import (
    "io"
    "net/http"
)

func main() {
    mux1 := http.NewServeMux()
    mux1.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        io.WriteString(w, "sub index")
    })
    mux1.HandleFunc("/sub1", func(w http.ResponseWriter, r *http.Request) {
        io.WriteString(w, "sub 1")
    })

    mux := http.NewServeMux()
    mux.Handle("/index", mux1)

    http.ListenAndServe(":8000", mux)
}

1 Ответ

0 голосов
/ 25 мая 2018

Ваш пример не работает, потому что вы использовали путь /index для регистрации «внешнего» обработчика, который является одиночным путем (потому что он не заканчивается косой чертой /), а не корневым поддеревом (то есть все пути, начинающиеся с /index/).Это задокументировано в http.ServeMux:

Исправлено имя шаблона, корневые пути, например, "/favicon.ico", или корневые поддеревья, например "/ images /" (примечание.косая черта).Более длинные шаблоны имеют приоритет над более короткими, поэтому, если есть обработчики, зарегистрированные как для "/ images /", так и "/ images / thumbnails /", последний обработчик будет вызываться для путей, начинающихся с "/ images / thumbnails /" и первогобудет получать запросы на любые другие пути в поддереве "/ images /".

А также потому, что "подчиненный маршрутизатор" не увидит путь, подобный "/" или "/sub1", который вы использовали для регистрацииобработчики, но полный путь, то есть: "/index/" и "/index/sub1".

Так что основной маршрутизатор должен сделать «обрезать» префикс "/index", который является путемон был зарегистрирован (без косой черты).К счастью, стандартная библиотека имеет готовое решение для этого: http.StripPrefix().

Итак, рабочее решение:

mux1 := http.NewServeMux()
mux1.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "sub index")
})
mux1.HandleFunc("/sub1", func(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "sub 1")
})

mux := http.NewServeMux()
mux.Handle("/index/", http.StripPrefix("/index", mux1))

http.ListenAndServe(":8000", mux)

Тестирование:

  • URL: http://localhost:8000/index/
    Ответ: sub index

  • URL: http://localhost:8000/index/sub1
    Ответ: sub 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...