Тип 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"))))
}
Читайте также:
Комментариев нет:
Отправить комментарий