Clientes HTTP, Peticiones mediante POST

¿Cómo crear un cliente que haga una petición POST en Go?

Para el siguiente ejemplo vamos a utilizar el servicio httpbin.org, el cual permite realizar peticiones y analizar la respuesta de estas.

Primero realizamos la composición de los datos.

datos := strings.NewReader(`{"nombre":"Luis"}`)

Ahora realizamos el envío de los datos mediante http.Post. Esto nos retornara dos posibles valores, la respuesta y el error.

res, err := http.Post("https://httpbin.org/post", "application/json", datos)

Cerramos la lectura del body al completar el programa.

defer res.Body.Close()

Realizamos la lectura del body.

body, err := ioutil.ReadAll(res.Body)

Si no hay inconvenientes imprimimos el cuerpo.

fmt.Printf("%s", body)

De forma conjunta, el programa luciría así.

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "strings"
)

func main() {
    datos := strings.NewReader(`{"nombre":"Luis"}`)
    res, err := http.Post("https://httpbin.org/post", "application/json", datos)
    if err != nil {
        log.Fatal(err)
    }
    defer res.Body.Close()
    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s", body)
}

Si realizamos la ejecución del programa. El contenido de la respuesta es la siguiente.

$ go run .../main.go
{
  "args": {},
  "data": "{\"nombre\":\"Luis\"}",
  "files": {},
  "form": {},
  "headers": {
    "Accept-Encoding": "gzip",
    "Content-Length": "17",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "Go-http-client/1.1"
  },
  "json": {
    "nombre": "Luis"
  },
  "origin": "..., ...",
  "url": "https://httpbin.org/post"
}