Функция http.StripPrefix
Функция http.StripPrefix возвращает обработчик,
который удаляет заданный префикс из URL-пути запроса
перед передачей управления другому обработчику.
В первый параметр передается строка с префиксом для удаления,
во второй параметр передается обработчик типа http.Handler,
который получит запрос с измененным путем.
Синтаксис
http.StripPrefix(prefix string, handler http.Handler) http.Handler
Пример
Давайте создадим простой HTTP-сервер, который использует
http.StripPrefix для удаления префикса "/static"
из URL-пути, чтобы файлы отдавались из директории "./files":
package main
import (
"net/http"
)
func main() {
// Создаем файловый сервер для директории ./files
fs := http.FileServer(http.Dir("./files"))
// Удаляем префикс /static из URL-пути
handler := http.StripPrefix("/static", fs)
// Обрабатываем все запросы к /static/
http.Handle("/static/", handler)
// Запускаем сервер
http.ListenAndServe(":8080", nil)
}
После запуска сервера запрос к http://localhost:8080/static/style.css
будет преобразован в /style.css и файл будет искаться
в директории ./files/style.css.
Пример
Давайте создадим обработчик, который выводит измененный URL-путь после удаления префикса:
package main
import (
"fmt"
"net/http"
)
func main() {
// Создаем обработчик, который выводит путь запроса
originalHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Путь запроса: %s", r.URL.Path)
})
// Удаляем префикс /api из URL-пути
handler := http.StripPrefix("/api", originalHandler)
// Обрабатываем все запросы к /api/
http.Handle("/api/", handler)
// Запускаем сервер
http.ListenAndServe(":8080", nil)
}
При запросе к http://localhost:8080/api/users/123
обработчик получит путь /users/123 и выведет:
"Путь запроса: /users/123"
Пример
Давайте рассмотрим пример с несколькими вложенными обработчиками, где мы удаляем префикс для API-эндпоинтов:
package main
import (
"encoding/json"
"net/http"
)
type Message struct {
Text string `json:"text"`
}
func main() {
// Создаем обработчик для API
apiHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
msg := Message{Text: "Привет от API"}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(msg)
})
// Удаляем префикс /v1 из URL-пути
handler := http.StripPrefix("/v1", apiHandler)
// Обрабатываем все запросы к /v1/
http.Handle("/v1/", handler)
// Запускаем сервер
http.ListenAndServe(":8080", nil)
}
Запрос к http://localhost:8080/v1/message будет
передан обработчику с путем /message, который вернет JSON-ответ:
{"text":"Привет от API"}
Смотрите также
-
функцию
http.FileServer,
которая создает обработчик для раздачи статических файлов -
функцию
http.ServeFile,
которая отдает один файл в ответ на HTTP-запрос -
функцию
http.Handle,
которая регистрирует обработчик для определенного пути -
функцию
http.HandleFunc,
которая регистрирует функцию-обработчик для определенного пути