Интерфейс http.ResponseWriter

Интерфейс http.ResponseWriter является ключевым элементом при разработке HTTP-серверов на Go. Он передается в качестве второго параметра в функции-обработчики и предоставляет методы для управления ответом клиенту. Основные методы интерфейса: Write записывает данные в тело ответа, WriteHeader устанавливает код состояния HTTP, Header возвращает объект для работы с заголовками ответа.

Синтаксис

gotype ResponseWriter interface {
  Header() Header
  Write([]byte) (int, error)
  WriteHeader(statusCode int)
}

Метод WriteHeader

Метод WriteHeader устанавливает код состояния HTTP для ответа. Если метод не вызывать явно, Go автоматически отправляет статус 200 OK при первом вызове Write. Важно: метод должен быть вызван до записи данных в тело ответа.

Пример

Простой обработчик, который возвращает приветствие и устанавливает код статуса 200:

gopackage 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:

gopackage 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:

gopackage 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, если ресурс не найден:

gopackage 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-запрос