Как мультиплексор сервера по умолчанию соответствует шаблону URL

Я видел простую реализацию маршрутизатора, использующую следующий код для извлечения параметров 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. Первый маршрут будет совпадать, а второй, более короткий путь, не будет совпадать. Технически путь запроса не должен соответствовать какому-либо маршруту, так как один слишком длинный для совпадения, а другой слишком короткий.

Это поднимает вопрос о том, каким правилам Голанг mux следует при сопоставлении запросов с маршрутами. На первый взгляд кажется, что он использует самое длинное совпадение пути, но что, если кратчайший путь определен первым в исходном коде программы?

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


person Cholthi Paul Ttiopic    schedule 18.03.2019    source источник
comment
Как насчет того, чтобы увидеть это? stackoverflow .com/questions/30474313/.   -  person sh.seo    schedule 18.03.2019
comment
Как ServeMux сопоставляет пути, описано в его документации: https://golang.org/pkg/net/http/#ServeMux   -  person mkopriva    schedule 18.03.2019


Ответы (1)


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

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

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

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

person Flimzy    schedule 18.03.2019