Метод http.ServeMux.ServeHTTP
Метод http.ServeMux.ServeHTTP реализует интерфейс http.Handler и обрабатывает HTTP-запросы, направляя их к зарегистрированным обработчикам. Первым параметром метод принимает http.ResponseWriter для формирования ответа, вторым — указатель на http.Request с данными запроса.
Метод автоматически выбирает подходящий обработчик на основе пути запроса, используя правила сопоставления, зарегистрированные через методы Handle и HandleFunc. Если обработчик не найден, возвращается ответ с кодом состояния 404.
Синтаксис
func (mux *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request)
Пример
Давайте создадим простой мультиплексор и зарегистрируем обработчики для разных путей:
package main
import (
"fmt"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Main page")
})
mux.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello world!")
})
server := &http.Server{
Addr: ":8080",
Handler: mux,
}
fmt.Println("Server started on port 8080")
server.ListenAndServe()
}
Результат выполнения кода при обращении к разным путям:
"Main page"
"Hello world!"
Пример
Давайте продемонстрируем, как мультиплексор обрабатывает запросы с параметрами в пути:
package main
import (
"fmt"
"net/http"
"strings"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/user/", func(w http.ResponseWriter, r *http.Request) {
path := strings.TrimPrefix(r.URL.Path, "/user/")
if path == "" {
fmt.Fprintln(w, "User ID is empty")
return
}
fmt.Fprintf(w, "User ID: %s\n", path)
})
mux.HandleFunc("/api/v1/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "API v1 endpoint: %s\n", r.URL.Path)
})
server := &http.Server{
Addr: ":8080",
Handler: mux,
}
fmt.Println("Server started on port 8080")
server.ListenAndServe()
}
Результат выполнения кода при обращении к различным URL:
"User ID is empty"
"User ID: 12345"
"API v1 endpoint: /api/v1/data"
Пример
Давайте рассмотрим обработку запросов с различными методами HTTP:
package main
import (
"fmt"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/resource", func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
fmt.Fprintln(w, "GET request - read resource")
case http.MethodPost:
fmt.Fprintln(w, "POST request - create resource")
case http.MethodPut:
fmt.Fprintln(w, "PUT request - update resource")
case http.MethodDelete:
fmt.Fprintln(w, "DELETE request - remove resource")
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
})
server := &http.Server{
Addr: ":8080",
Handler: mux,
}
fmt.Println("Server started on port 8080")
server.ListenAndServe()
}
Результат выполнения кода при различных HTTP-методах:
"GET request - read resource"
"POST request - create resource"
"PUT request - update resource"
"DELETE request - remove resource"
Смотрите также
-
функцию
http.NewServeMux,
которая создает новый экземпляр мультиплексора -
метод
http.ServeMux.Handle,
который регистрирует обработчик для указанного пути -
метод
http.ServeMux.HandleFunc,
который регистрирует функцию-обработчик для указанного пути -
функцию
http.ListenAndServe,
которая запускает HTTP-сервер с указанным обработчиком