Интерфейс http.Handler

Интерфейс http.Handler является центральным механизмом обработки HTTP-запросов в пакете net/http. Он определяет единственный метод ServeHTTP, который принимает два параметра: запись ответа http.ResponseWriter и указатель на запрос *http.Request. Любая структура, реализующая этот метод, может выступать в роли обработчика HTTP-запросов.

Синтаксис

gotype Handler interface {
  ServeHTTP(ResponseWriter, *Request)
}

Пример

Давайте создадим простую структуру myHandler, которая реализует интерфейс http.Handler и обрабатывает запросы:

gopackage main

import (
  "fmt"
  "net/http"
)

type myHandler struct{}

func (h myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Hello, World!")
}

func main() {
  handler := myHandler{}
  http.ListenAndServe(":8080", handler)
}

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

go"Hello, World!"

Пример

В этом примере обработчик анализирует путь запроса и возвращает разный ответ в зависимости от URL:

gopackage main

import (
  "fmt"
  "net/http"
)

type routeHandler struct{}

func (h routeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  switch r.URL.Path {
  case "/":
    fmt.Fprintf(w, "Home page")
  case "/about":
    fmt.Fprintf(w, "About page")
  default:
    http.NotFound(w, r)
  }
}

func main() {
  handler := routeHandler{}
  http.ListenAndServe(":8080", handler)
}

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

go"Home page"    // при запросе /
"About page"   // при запросе /about

Пример

Интерфейс http.Handler также может быть реализован с помощью функции-обработчика через тип http.HandlerFunc. Это удобный способ превратить обычную функцию в обработчик:

gopackage main

import (
  "fmt"
  "net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Hello from HandlerFunc")
}

func main() {
  handler := http.HandlerFunc(helloHandler)
  http.ListenAndServe(":8080", handler)
}

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

go"Hello from HandlerFunc"

Смотрите также

  • тип http.HandlerFunc,
    который позволяет использовать функции как обработчики
  • мультиплексор http.ServeMux,
    который маршрутизирует запросы к разным обработчикам
  • функцию http.Handle,
    которая регистрирует обработчик в глобальном мультиплексоре
  • интерфейс http.ResponseWriter,
    который используется для формирования HTTP-ответа