Тип http.Response

Тип http.Response представляет собой HTTP-ответ, полученный от сервера. Он содержит информацию о статусе ответа, заголовки и тело ответа. Основные поля структуры: StatusCode - код состояния HTTP (например, 200, 404), Header - заголовки ответа, Body - тело ответа (поток для чтения), ContentLength - длина содержимого. Тело ответа Body должно быть закрыто после чтения с помощью Close, чтобы избежать утечек ресурсов.

Структура http.Response

gotype Response struct {
  Status   string
  StatusCode int
  Header   Header
  Body     io.ReadCloser
  ContentLength int64
  // другие поля
}

Поле StatusCode содержит числовой код ответа, Status - текстовое описание статуса, Header - карта заголовков, Body - поток для чтения данных ответа, ContentLength - размер тела в байтах.

Пример чтения HTTP-ответа

Давайте выполним GET-запрос и прочитаем ответ от сервера:

gopackage main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  res, err := http.Get("https://httpbin.org/get")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer res.Body.Close()

  body, err := io.ReadAll(res.Body)
  if err != nil {
    fmt.Println("Error reading body:", err)
    return
  }

  fmt.Println("Status:", res.Status)
  fmt.Println("StatusCode:", res.StatusCode)
  fmt.Println("ContentLength:", res.ContentLength)
  fmt.Println("Body:", string(body))
}

Результат выполнения кода:

go"Status: 200 OK"
"StatusCode: 200"
"ContentLength: 256"
"Body: { ... }"

В этом примере мы выполняем GET-запрос, читаем тело ответа и выводим информацию о статусе и содержимом. Обратите внимание на использование defer res.Body.Close() для закрытия тела после завершения функции.

Пример проверки статуса ответа

Давайте проверим статус ответа и обработаем ошибки:

gopackage main

import (
  "fmt"
  "net/http"
)

func main() {
  res, err := http.Get("https://httpbin.org/status/404")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer res.Body.Close()

  if res.StatusCode == http.StatusOK {
    fmt.Println("Request successful")
  } else {
    fmt.Printf("Request failed with status: %d %s\n",
      res.StatusCode, res.Status)
  }
}

Результат выполнения кода:

go"Request failed with status: 404 Not Found"

Здесь мы выполняем запрос к недоступному URL и проверяем статус ответа. Используем константу http.StatusOK для сравнения с кодом 200.

Пример чтения заголовков ответа

Давайте прочитаем заголовки HTTP-ответа:

gopackage main

import (
  "fmt"
  "net/http"
)

func main() {
  res, err := http.Get("https://httpbin.org/get")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer res.Body.Close()

  fmt.Println("Content-Type:", res.Header.Get("Content-Type"))
  fmt.Println("Server:", res.Header.Get("Server"))

  for key, values := range res.Header {
    fmt.Printf("%s: %v\n", key, values)
  }
}

Результат выполнения кода:

go"Content-Type: application/json"
"Server: gunicorn/19.9.0"
"Access-Control-Allow-Origin: *"
"Connection: keep-alive"

В этом примере мы используем метод Header.Get для получения конкретных заголовков и перебираем все заголовки с помощью цикла for.

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

  • тип http.Request,
    который представляет HTTP-запрос на сервер
  • метод Client.Do,
    который выполняет HTTP-запрос и возвращает ответ
  • метод http.Get,
    который выполняет GET-запрос и возвращает ответ
  • тип http.ResponseWriter,
    который используется для формирования ответа на сервере