Метод http.ServeMux.ServeHTTP

Метод http.ServeMux.ServeHTTP реализует интерфейс http.Handler и обрабатывает HTTP-запросы, направляя их к зарегистрированным обработчикам. Первым параметром метод принимает http.ResponseWriter для формирования ответа, вторым — указатель на http.Request с данными запроса.

Метод автоматически выбирает подходящий обработчик на основе пути запроса, используя правила сопоставления, зарегистрированные через методы Handle и HandleFunc. Если обработчик не найден, возвращается ответ с кодом состояния 404.

Синтаксис

gofunc (mux *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request)

Пример

Давайте создадим простой мультиплексор и зарегистрируем обработчики для разных путей:

gopackage 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()
}

Результат выполнения кода при обращении к разным путям:

go"Main page"
"Hello world!"

Пример

Давайте продемонстрируем, как мультиплексор обрабатывает запросы с параметрами в пути:

gopackage 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:

go"User ID is empty"
"User ID: 12345"
"API v1 endpoint: /api/v1/data"

Пример

Давайте рассмотрим обработку запросов с различными методами HTTP:

gopackage 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-методах:

go"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-сервер с указанным обработчиком