Функция http.StripPrefix

Функция http.StripPrefix возвращает обработчик, который удаляет заданный префикс из URL-пути запроса перед передачей управления другому обработчику. В первый параметр передается строка с префиксом для удаления, во второй параметр передается обработчик типа http.Handler, который получит запрос с измененным путем.

Синтаксис

gohttp.StripPrefix(prefix string, handler http.Handler) http.Handler

Пример

Давайте создадим простой HTTP-сервер, который использует http.StripPrefix для удаления префикса "/static" из URL-пути, чтобы файлы отдавались из директории "./files":

gopackage 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-путь после удаления префикса:

gopackage 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 и выведет:

go"Путь запроса: /users/123"

Пример

Давайте рассмотрим пример с несколькими вложенными обработчиками, где мы удаляем префикс для API-эндпоинтов:

gopackage 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-ответ:

go{"text":"Привет от API"}

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

  • функцию http.FileServer,
    которая создает обработчик для раздачи статических файлов
  • функцию http.ServeFile,
    которая отдает один файл в ответ на HTTP-запрос
  • функцию http.Handle,
    которая регистрирует обработчик для определенного пути
  • функцию http.HandleFunc,
    которая регистрирует функцию-обработчик для определенного пути