Метод http.Client.Post

Метод http.Client.Post отправляет HTTP POST запрос на указанный URL. В первый параметр мы передаем URL, на который будет отправлен запрос. Во второй параметр мы передаем тип содержимого (Content-Type) в виде строки. В третий параметр мы передаем тело запроса в виде интерфейса io.Reader, часто это bytes.Reader или strings.Reader. Метод возвращает указатель на http.Response и ошибку. После завершения работы с ответом его тело должно быть закрыто.

Синтаксис

gohttp.Client.Post(url, contentType, body)

Пример

Давайте отправим POST запрос с JSON данными на тестовый сервер:

gopackage main

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

func main() {
  client := &http.Client{}
  url := "https://jsonplaceholder.typicode.com/posts"
  jsonData := []byte(`{"title": "foo", "body": "bar", "userId": 1}`)
  body := bytes.NewReader(jsonData)

  res, err := client.Post(url, "application/json", body)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  fmt.Println(res.Status)
}

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

go"201 Created"

Пример

Давайте отправим POST запрос с данными формы:

gopackage main

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

func main() {
  client := &http.Client{}
  urlStr := "https://httpbin.org/post"
  formData := url.Values{}
  formData.Set("username", "john_doe")
  formData.Set("password", "secret123")
  body := strings.NewReader(formData.Encode())

  res, err := client.Post(urlStr, "application/x-www-form-urlencoded", body)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  fmt.Println(res.StatusCode)
}

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

go"200"

Пример

Давайте отправим POST запрос с XML данными:

gopackage main

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

func main() {
  client := &http.Client{}
  url := "https://httpbin.org/post"
  xmlData := []byte(`<?xml version="1.0"?><user><name>Alice</name><age>30</age></user>`)
  body := bytes.NewReader(xmlData)

  res, err := client.Post(url, "application/xml", body)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  responseBody, _ := io.ReadAll(res.Body)
  fmt.Println(string(responseBody))
}

Результат выполнения кода (сокращенно):

go"{\"args\": {}, \"data\": \"<?xml version=\\\"1.0\\\"?><user><name>Alice</name><age>30</age></user>\", ...}"

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

  • метод http.Client.Get,
    который отправляет HTTP GET запрос
  • метод http.Client.PostForm,
    который отправляет POST запрос с данными формы
  • метод http.Client.Head,
    который отправляет HTTP HEAD запрос
  • метод http.Client.Do,
    который выполняет произвольный HTTP запрос