четверг, 6 февраля 2020 г.

Тип ServeMux пакета net/http в Golang

Тип 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-адресу запроса.


Читайте также:


Комментариев нет:

Отправить комментарий