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

Тип Handler, функции FileServer, NotFoundHandler пакета net/http в Golang

Тип Handler

Handler отвечает на запрос HTTP.

ServeHTTP должен записать заголовки ответа и данные в ResponseWriter и затем вернуться. Возвращает сигнал о том, что запрос завершен; недопустимо использовать ResponseWriter или читать из Request.Body после или одновременно с завершением вызова ServeHTTP.

В зависимости от программного обеспечения HTTP-клиента, версии протокола HTTP и любых посредников между клиентом и сервером Go может быть невозможным чтение из Request.Body после записи в ResponseWriter. Осторожные обработчики должны сначала прочитать Request.Body, а затем ответить.

За исключением чтения тела, обработчики не должны изменять предоставленный запрос.

Если ServeHTTP вызывает panic, сервер (вызывающий ServeHTTP) предполагает, что эффект паники был изолирован для активного запроса. Он восстанавливает панику, записывает трассировку стека в журнал ошибок сервера и либо закрывает сетевое соединение, либо отправляет HTTP/2 RST_STREAM, в зависимости от протокола HTTP. Чтобы прервать обработчик, чтобы клиент увидел прерванный ответ, но сервер не зарегистрировал ошибку, вызовите panic со значением ErrAbortHandler.

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

Функция FileServer

func FileServer(root FileSystem) Handler

FileServer возвращает обработчик, который обслуживает HTTP-запросы с содержимым файловой системы с корнем в root.

Чтобы использовать реализацию файловой системы операционной системы, используйте http.Dir:

http.Handle("/", http.FileServer(http.Dir("/tmp")))

В особом случае возвращаемый файловый сервер перенаправляет любой запрос, оканчивающийся на "/index.html", по тому же пути, без конечного "index.html".

Примеры:

package main

import (
  "log"
  "net/http"
)

func main() {
  // Простой статический веб-сервер:
  log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir("/usr/share/doc"))))
}

Пример:

package main

import (
  "net/http"
)

func main() {
  // Обслуживаем каталог на диске (/tmp) под альтернативным URL
  // путем (/tmpfiles/), используем StripPrefix для изменения запроса
  // пути URL до того, как FileServer его увидит:
  http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
}

Функция NotFoundHandler

func NotFoundHandler() Handler

NotFoundHandler возвращает простой обработчик запроса, который отвечает на каждый запрос с ответом “404 page not found”.

Пример:

package main

import (
  "fmt"
  "log"
  "net/http"
)

func newPeopleHandler() http.Handler {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "This is the people handler.")
  })
}

func main() {
  mux := http.NewServeMux()

  // Создаем тестовый обработчик для возврата 404
  mux.Handle("/resources", http.NotFoundHandler())

  // Создаем тестовый обработчик для возврата 200
  mux.Handle("/resources/people/", newPeopleHandler())

  log.Fatal(http.ListenAndServe(":8080", mux))
}

Функция StripPrefix

func StripPrefix(prefix string, h Handler) Handler

StripPrefix возвращает обработчик, который обслуживает HTTP-запросы, удаляя указанный префикс из пути URL запроса и вызывая обработчик h. StripPrefix обрабатывает запрос пути, который не начинается с префикса, отвечая сообщением об ошибке HTTP 404 not found.

Пример:

package main

import (
  "net/http"
)

func main() {
  // Обслуживаем каталог на диске (/tmp) по альтернативному URL
  // пути (/tmpfiles/), используем StripPrefix для изменения 
  // пути URL запроса до того, как FileServer его увидит:
  http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
}


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


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

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