Как по умолчанию мультиплексирование сервера соответствует URL-адресу - PullRequest
0 голосов
/ 18 марта 2019

Я видел простую реализацию маршрутизатора, использующую следующий код для извлечения параметров url из пути запроса.

handler := http.NewServerMux()
handler.HandleFunc('/user/', func(w http.ResponseWriter, r *http.Request) {
     name := strings.Replace(r.URL.Path, '/user/', "", 1)// this code

    io.WriteString(w, fmt.Sprintf("Hello %s\n",name)
})

Тогда они будут другим маршрутом, подобным /user (в уведомлении отсутствует косая черта).

handler.HandleFunc('/user', handleUser)

Допустим, например, r.URL.Path - это /user/name.Первый маршрут будет соответствовать, в то время как второй более короткий путь не найдется.Технически, путь запроса не должен совпадать ни с одним маршрутом, так как один слишком длинный для сопоставления, а другой слишком короткий.

Возникает вопрос о том, каким правилам Golang mux следовать при сопоставлении запроса с маршрутами.Сначала кажется, что он выбирает самое длинное совпадение пути, но что, если сначала в источнике программы определен самый короткий путь?

Может кто-нибудь дать простое объяснение того, как ServerMuxведет себя.

1 Ответ

4 голосов
/ 18 марта 2019

Лучшее объяснение - официальное объяснение, которое можно найти в документации для пакета http .Частично:

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

Обратите внимание, что поскольку шаблон, оканчивающийся косой чертой, называет корневое поддерево, шаблон "/" соответствует всем путям, не сопоставленным с другими зарегистрированными шаблонами.а не только URL с путем == "/".

Как всегда, если вам нужна дополнительная информация, прочитайте документы.

...