Servidores Web, Content Type

¿Qué es la cabecera Content Type?

Una aplicación de servidor, puede responder con diferentes tipos de contenido (Content-Type), algunos de ellos son…

json (application/json)

w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Write([]byte(`{"mensaje": "Hola Mundo"}`))

xml (application/xml)

w.Header().Set("Content-Type", "application/xml; charset=utf-8")
w.Write([]byte(`<?xml version="1.0" encoding="utf-8"?><Mensaje>Hello World</Mensaje>`)

texto plano (text/plain)

w.Header().Set("Content-Type", "text/plain; charset=utf-8")
w.Write([]byte("Hola Mundo"))

Supongamos que deseamos enviar una respuesta en base al tipo de contenido con el cual se realizo la petición en cada uno de los 3 anteriores casos.

Mediante el objeto http.Request es posible acceder al tipo de contenido de la solicitud utilizando r.Header.Get(“Accept”).

Ejemplo del uso del uso de la cabecera Content-Type en Go

package main

import "net/http"

func Home(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
        http.NotFound(w, r)
        return
    }
    switch r.Header.Get("Accept") {
    case "application/json":
        w.Header().Set("Content-Type", "application/json; charset=utf-8")
        w.Write([]byte(`{"mensaje":"Hola Mundo"}`))
    case "application/xml":
        w.Header().Set("Content-Type", "application/xml; charset=utf-8")
        w.Write([]byte(`<?xml version="1.0" encoding="utf-8"?><Mensaje>Hola Mundo</Mensaje>`))
    default:
        w.Header().Set("Content-Type", "text/plain; charset=utf-8")
        w.Write([]byte("Hola Mundo"))
    }
}

func main() {
    http.HandleFunc("/", Home)
    http.ListenAndServe(":8000", nil)
}

En el anterior ejemplo hemos utilizado un switch sobre el valor de Accept, de forma que existen los tres posibles escenarios y por default se utiliza text/plain.

Ejemplos de consultas mediante curl utilizando diferentes Content Type.

En curl es posible pasar este parámetro utilizando el argumento -H.

¿Cómo hacer una petición tipo json en curl?

$ curl -is http://localhost:8000 -H 'Accept: application/json'
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Sat, 20 Apr 2019 02:06:05 GMT
Content-Length: 24

{"mensaje":"Hola Mundo"}

¿Cómo hacer una petición tipo xml en curl?

$ curl -is http://localhost:8000 -H 'Accept: application/xml'
HTTP/1.1 200 OK
Content-Type: application/xml; charset=utf-8
Date: Sat, 20 Apr 2019 02:06:30 GMT
Content-Length: 67

<?xml version="1.0" encoding="utf-8"?><Mensaje>Hola Mundo</Mensaje>

¿Cómo hacer una petición tipo text/html en curl?

$ curl -is http://localhost:8000 -H 'Accept: text/html'
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Sat, 20 Apr 2019 02:07:10 GMT
Content-Length: 10

Hola Mundo