Тип ServeMux
ServeMux - это мультиплексор HTTP-запросов. Он сопоставляет URL-адрес каждого входящего запроса со списком зарегистрированных шаблонов и вызывает обработчик для шаблона, который наиболее точно соответствует URL-адресу.
Фиксированные имена шаблонов, корневые пути, например "/favicon.ico", или корневые поддеревья, например "/images/" (обратите внимание на закрывающий слэш). Более длинные шаблоны имеют приоритет над более короткими, поэтому, если есть обработчики, зарегистрированные как для "/images/", так и "/images/thumbnails/", последний обработчик будет вызываться для путей, начинающихся с "/images/thumbnails/", а первый будет получать запросы на любые другие пути в поддереве "/images/".
Обратите внимание, что, поскольку шаблон, заканчивающийся слэшем, называет корневое поддерево, шаблон "/" соответствует всем путям, которые не соответствуют другим зарегистрированным шаблонам, а не только URL-адресу с путем == "/".
Если поддерево было зарегистрировано и получен запрос с именем корня поддерева без его косой черты, ServeMux перенаправляет этот запрос в корень поддерева (добавляя косую черту). Это поведение может быть отменено отдельной регистрацией пути без завершающего слэша. Например, регистрация "/images/" заставляет ServeMux перенаправить запрос "/images" на "/images/", если только "/images" не был зарегистрирован отдельно.
При желании шаблоны могут начинаться с имени хоста, ограничивая совпадения только с URL-адресами на этом хосте. Специфичные для хоста шаблоны имеют приоритет над общими шаблонами, так что обработчик может зарегистрироваться для двух шаблонов "/codesearch" и "codesearch.google.com/", не принимая также запросы на "http://www.google.com/".
ServeMux также заботится о санации пути URL-запроса и заголовка хоста, удалении номера порта и перенаправлении любого запроса содержащего . или .. элементы или повторяющиеся слэши к эквивалентному, более чистому URL.
type ServeMux struct {
// содержит фильтруемые или неэкспортируемые поля
}
Функция NewServeMux
func NewServeMux() *ServeMux
NewServeMux выделяет и возвращает новый ServeMux.
Метод (*ServeMux) Handle
func (mux *ServeMux) Handle(pattern string, handler Handler)
Handle регистрирует обработчик для данного шаблона. Если обработчик для шаблона уже существует, Handle вызывает panic.
Пример использования ServeMux и его метода Handle:
package main
import (
"fmt"
"net/http"
)
type apiHandler struct{}
func (apiHandler) ServeHTTP(http.ResponseWriter, *http.Request) {}
func main() {
mux := http.NewServeMux()
mux.Handle("/api/", apiHandler{})
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
// "/" паттерн соотвествует всему,
// поэтому нам нужно проверить
// что это на самом деле запрос корня
if req.URL.Path != "/" {
http.NotFound(w, req)
return
}
fmt.Fprintf(w, "Welcome to the home page!")
})
log.Fatal(http.ListenAndServe(":8080", mux))
}
Метод (*ServeMux) HandleFunc
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request))
HandleFunc регистрирует функцию-обработчик для данного шаблона.
Метод (*ServeMux) Handler
func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string)
Появился начиная с версии Go 1.1
Handler возвращает обработчик для использования для данного запроса, консультируясь с r.Method, r.Host и r.URL.Path. Он всегда возвращает ненулевой обработчик. Если путь не в своей канонической форме, обработчик будет внутренне сгенерированным обработчиком, который перенаправляет на канонический путь. Если хост содержит порт, он игнорируется при сопоставлении обработчиков.
Путь и хост используются без изменений для запросов CONNECT.
Handler также возвращает зарегистрированный шаблон, соответствующий запросу, или, в случае внутренних переадресаций, шаблон, который будет соответствовать после выполнения перенаправления.
Если нет зарегистрированного обработчика, который применяется к запросу, Handler возвращает обработчик “page not found” (страница не найдена) и пустой шаблон.
Метод (*ServeMux) ServeHTTP
func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request)
ServeHTTP отправляет запрос обработчику, чей шаблон наиболее точно соответствует URL-адресу запроса.
Читайте также:
- Функции пакета net/http, примеры
- Функции Get, Head, Post, PostForm пакета net/http в Golang
- Пакет net/http, краткий обзор
Комментариев нет:
Отправить комментарий