Servidores Web, Manejo de datos mediante POST

En el capítulo anterior vimos que es posible procesar variables enviadas a través de la url, sin embargo existen algunas limitantes como.

  • Existe un límite en el tamaño del string del envío.
  • Las seguridad se ve comprometida ya que las variables están expuestas.
  • No se pueden enviar datos como imágenes, o archivos de texto adjuntos.

Ejemplo del uso de ioutil.ReadAll() para leer una petición POST

package main

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

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Path != "/" {
            http.NotFound(w, r)
            return
        }
        datosDelBody, err := ioutil.ReadAll(r.Body)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Fprintf(w, "%s", datosDelBody)
    })
    http.ListenAndServe(":8000", nil)
}

A diferencia del ejemplo anterior, para procesar el contenido de una petición usamos el método ReadAll del paquete io/ioutil que procesa Body del http.Request.

datosDelBody, err := ioutil.ReadAll(r.Body)

Para enviar datos mediante post podemos usar curl.

$ curl http://localhost:8000/ -X POST -d "&name=Raul&lastname=Jimenez&"

Y obtendremos la respuesta.

&name=Raul&lastname=Jimenez&