Интерфейс http.ResponseWriter
Интерфейс http.ResponseWriter является ключевым элементом при
разработке HTTP-серверов на Go. Он передается в качестве второго
параметра в функции-обработчики и предоставляет методы для
управления ответом клиенту. Основные методы интерфейса:
Write записывает данные в тело ответа,
WriteHeader устанавливает код состояния HTTP,
Header возвращает объект для работы с заголовками ответа.
Синтаксис
type ResponseWriter interface {
Header() Header
Write([]byte) (int, error)
WriteHeader(statusCode int)
}
Метод WriteHeader
Метод WriteHeader устанавливает код состояния HTTP
для ответа. Если метод не вызывать явно, Go автоматически
отправляет статус 200 OK при первом вызове Write.
Важно: метод должен быть вызван до записи данных в тело ответа.
Пример
Простой обработчик, который возвращает приветствие и устанавливает код статуса 200:
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("Hello, World!"))
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
Метод Header
Метод Header возвращает объект типа http.Header,
который представляет собой карту заголовков HTTP-ответа.
С помощью этого объекта можно устанавливать и изменять
заголовки перед отправкой ответа.
Пример
Установка заголовков Content-Type и
X-Custom-Header:
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Header().Set("X-Custom-Header", "CustomValue")
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, `{"message": "Hello"}`)
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
Метод Write
Метод Write принимает срез байтов и записывает его
в тело HTTP-ответа. Этот метод автоматически вызывает
WriteHeader(200), если статус еще не был установлен.
Метод возвращает количество записанных байтов и ошибку.
Пример
Запись HTML-страницы с помощью метода Write:
package main
import (
"net/http"
)
func htmlHandler(w http.ResponseWriter, r *http.Request) {
html := []byte(`
<html>
<body>
<h1>Hello, World!</h1>
<p>This is a response</p>
</body>
</html>
`)
w.Header().Set("Content-Type", "text/html")
w.Write(html)
}
func main() {
http.HandleFunc("/", htmlHandler)
http.ListenAndServe(":8080", nil)
}
Установка статуса ошибки
Для отправки клиенту статуса ошибки используется метод
WriteHeader с соответствующим кодом состояния.
После вызова этого метода тело ответа можно записать
с помощью метода Write.
Пример
Обработчик, который возвращает статус 404, если ресурс не найден:
package main
import (
"fmt"
"net/http"
)
func notFoundHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
fmt.Fprintf(w, "404 - Page Not Found")
}
func main() {
http.HandleFunc("/", notFoundHandler)
http.ListenAndServe(":8080", nil)
}
Смотрите также
-
интерфейс
http.Handler,
который реализует обработку HTTP-запросов -
функцию
http.HandleFunc,
которая регистрирует функцию-обработчик для маршрута -
тип
http.Header,
представляющий заголовки HTTP-запроса или ответа -
структуру
http.Request,
представляющую входящий HTTP-запрос