Что такое мультиплексор HTTP-запроса?

Я изучал Голанг и заметил, что многие люди создают серверы, используя http.NewServeMux() функционировать, и я не очень понимаю, что он делает.

Я прочитал это:

ServeMux - это мультиплексор HTTP-запросов. Он сопоставляет URL-адрес каждого входящего запроса со списком зарегистрированных шаблонов и вызывает обработчик для шаблона, который наиболее точно соответствует URL-адресу.

Чем это отличается от просто делать что-то вроде:

http.ListenAndServe(addr, nil)
http.Handle("/home", home)
http.Handle("/login", login)

Какова цель использования мультиплексирования?

1 ответ

Решение

От net/http GoDoc и Source.

ListenAndServe starts an HTTP server with a given address and handler. The handler is usually nil, which means to use DefaultServeMux. Handle and HandleFunc add handlers to DefaultServeMux

DefaultServeMux это просто предопределенный http.ServeMux

var DefaultServeMux = &defaultServeMux
var defaultServeMux ServeMux

Как вы видете http.Handle звонки DefaultServeMux внутренне.

func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }

Цель http.NewServeMux() это иметь свой собственный экземпляр http.Servermux например, когда вам требуются две функции http.ListenAndServe, которые прослушивают разные порты с разными маршрутами.

Мультиплексор в Golang - это некоторые вещи, такие как аппаратный мультиплексор, который умножает некоторые входы на некоторые выходы

я дал тебе простой экзамен

type CustomMultiplexer struct {
}

данный мультиплексор должен реализовывать ServeHTTP метод для регистрации int http на входах сервера

func (mux CustomMultiplexer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path == "/" {
        SimpleRequestHandler(w, r)
        return
    }
    http.NotFound(w, r)
    return
}

мой SimpleRequestHandler это следующий метод

func SimpleRequestHandler(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case http.MethodGet:
        mySimpleGetRequestHandler(w, r)
        break
    default:
        http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
        break
    }
}

знаю, что я могу использовать свой CustomMultiplxere сделать мультиплексирование между входящими запросами

func main() {
    customServer := CustomServer{}
    err := http.ListenAndServe(":9001", &customServer)
    if err != nil {
        panic(err)
    }
}

то http.HandleFunc метод работает как мой данный простой мультиплексор.

Другие вопросы по тегам