Тип http.Client

Тип http.Client из пакета net/http представляет собой HTTP-клиент, который позволяет выполнять запросы к веб-серверам. В отличие от функций http.Get или http.Post, использование http.Client дает больше контроля над запросами: можно настроить таймауты, управлять куки, использовать собственный транспорт и переиспользовать один экземпляр для множества запросов. Поля структуры включают Timeout — ограничение времени выполнения запроса, Jar — хранилище для куки, и Transport — настройки сетевого уровня.

Синтаксис

goclient := &http.Client{
  Timeout: 10 * time.Second,
}

Пример

Создадим клиент с таймаутом 5 секунд и выполним GET-запрос к публичному API:

gopackage main

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

func main() {
  client := &http.Client{
    Timeout: 5 * time.Second,
  }

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

  fmt.Println("Status:", resp.Status)
}

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

go"Status: 200 OK"

Пример

Используем клиент для отправки POST-запроса с данными формы:

gopackage main

import (
  "fmt"
  "net/http"
  "net/url"
  "time"
)

func main() {
  client := &http.Client{
    Timeout: 10 * time.Second,
  }

  data := url.Values{
    "key1": {"value1"},
    "key2": {"value2"},
  }

  resp, err := client.PostForm("https://httpbin.org/post", data)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  defer resp.Body.Close()

  fmt.Println("Status:", resp.Status)
}

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

go"Status: 200 OK"

Пример

Переиспользуем один клиент для нескольких запросов и настроим куки-хранилище:

gopackage main

import (
  "fmt"
  "net/http"
  "net/http/cookiejar"
  "time"
)

func main() {
  jar, _ := cookiejar.New(nil)
  client := &http.Client{
    Timeout: 5 * time.Second,
    Jar:   jar,
  }

  // Первый запрос — сохраняем куки
  resp1, _ := client.Get("https://httpbin.org/cookies/set?name=value")
  resp1.Body.Close()

  // Второй запрос — куки будут отправлены автоматически
  resp2, _ := client.Get("https://httpbin.org/cookies")
  defer resp2.Body.Close()

  fmt.Println("Status:", resp2.Status)
}

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

go"Status: 200 OK"

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

  • метод Client.Do,
    который выполняет произвольный запрос
  • метод Client.Get,
    который выполняет GET-запрос
  • метод Client.Post,
    который выполняет POST-запрос
  • тип Transport,
    который управляет сетевым уровнем клиента