Habilitar CORS en GoLang

Sheeraz Gul 15 febrero 2024
  1. GoLang CORS
  2. Habilitar CORS en GoLang
  3. Paquete CORS en GoLang
  4. Use los métodos GET y POST con CORS en Go
Habilitar CORS en GoLang

Este tutorial demuestra cómo habilitar y usar CORS en GoLang.

GoLang CORS

El intercambio de recursos de origen cruzado (CORS) es un proceso basado en encabezado HTTP que define los orígenes desde los cuales los navegadores pueden cargar y usar recursos. El CORS se utiliza para relajar la política de Política del mismo origen, que permite que los scripts JS en una página accedan a datos en otras páginas.

La misma política de origen asegura que ambas páginas web sean del mismo origen. Esta política ayuda a mejorar la seguridad al aislar los documentos maliciosos.

El CORS se usa para relajar la misma política de origen usando los encabezados como se muestra en la tabla:

Encabezamiento Tipo Descripción
Origin Pedido Se utiliza para indicar el origen de la solicitud al servidor.
Access-Control-Request-Method Pedido Se utiliza para indicar los métodos HTTP para implementar la solicitud al servidor.
Access-Control-Request-Headers Pedido Se utiliza para indicar los encabezados en la solicitud al servidor.
Access-Control-Allow-Origin Respuesta Se utiliza para los orígenes permitidos por el servidor.
Access-Control-Allow-Methods Respuesta Se utiliza para la lista de métodos separados por comas permitidos por el servidor.
Access-Control-Allow-Headers Respuesta Se utiliza para la lista de encabezados separados por comas permitidos por el servidor.
Access-Control-Expose-Headers Respuesta Se utiliza para la lista de encabezados separados por comas que permiten al cliente acceder a una respuesta.
Access-Control-Max-Age Respuesta Se utiliza para informar al servidor cuántos segundos tarda en almacenar en caché la respuesta a la solicitud previa al vuelo.
Access-Control-Allow-Credentials Respuesta Se utiliza para permitir o restringir las Credenciales para el servidor.

Habilitar CORS en GoLang

Podemos implementar una función en Go donde implementamos nuestra política CORS usando el paquete net/http de GoLang. Siga el proceso paso a paso para habilitar el CORS en GO:

  • Cree una aplicación que se ejecute en el host local con un número de puerto que incluya encabezados que accederán a los recursos del servidor actual desde otras páginas. Ver los encabezados:
    Response_Writer.Header().Set("Content-Type", "text/plain; charset=utf-8")
    Response_Writer.Header().Set("Access-Control-Allow-Origin", "http://127.0.1.1:5555")
    Response_Writer.Header().Set("Access-Control-Max-Age", "10")
    
  • Como podemos ver, habilitamos nuestra política CORS, por lo que el script JS de http://127.0.1.1:5555 puede acceder a los datos de nuestras páginas o recursos. Es mejor mantener estos encabezados en un método para que podamos implementar la política CORS para nuestro servidor.
  • Ahora configure la política CORS para nuestro servidor; por ejemplo, la función para encabezados es DelftstackHandler. Ahora hacer esto:
    http.HandleFunc("/delftstack", DelftstackHandler)
    log.Fatal(http.ListenAndServe(":3000", nil))
    

El log.Fatal(http.ListenAndServe(":3000", nil)) establecerá la política CORS para nuestro servidor. Implementemos este ejemplo y veamos el resultado.

El archivo GoLang para la política CORS:

package main

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

func main() {

    http.HandleFunc("/delftstack", DelftstackHandler)

    log.Println("Listening the request..")
    log.Fatal(http.ListenAndServe(":3000", nil))
}

func DelftstackHandler(Response_Writer http.ResponseWriter, _ *http.Request) {

    Response_Writer.Header().Set("Content-Type", "text/plain; charset=utf-8")
    Response_Writer.Header().Set("Access-Control-Allow-Origin", "http://127.0.1.1:5555")
    Response_Writer.Header().Set("Access-Control-Max-Age", "10")
    fmt.Fprintf(Response_Writer, "Hello, this is delftstack.com!")
}

El archivo HTML/JS para la respuesta:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Delftstack</title>
</head>

<body>

    <script>
        async function doRequest() {
            let localhost_url = 'http://localhost:3000/delftstack';
            let page_response = await fetch(localhost_url);

            if (page_response.ok) {

                let text = await page_response.text();

                return text;
            } else {
                return `HTTP error: ${page_response.status}`;
            }
        }

        doRequest().then(data => {
            document.getElementById("print_output").innerText = data;
        });
    </script>

    <div id="print_output">

    </div>

</body>

</html>

El código anterior escribirá la respuesta ¡Hola, soy delftstack.com! desde el código Go en la página HTML/JS.

Ver la salida:

Política CORS

Paquete CORS en GoLang

Se utiliza un paquete de terceros CORS para implementar el uso compartido de recursos de origen cruzado mediante la definición del controlador NET/HTTP. Antes de comenzar a usar este paquete, tenemos que instalarlo.

Usa el siguiente comando:

go get github.com/rs/cors

Obtener CORS

Una vez que se haya instalado correctamente, podemos usar CORS en nuestro código. Probemos un ejemplo simple:

package main

import (
    "net/http"

    "github.com/rs/cors"
)

func main() {
    Demo_Mux := http.NewServeMux()
    Demo_Mux.HandleFunc("/", func(Response_Writer http.ResponseWriter, Req *http.Request) {
        Response_Writer.Header().Set("Content-Type", "application/json")
        Response_Writer.Write([]byte("{\"hello!\": \"This is delftstack.com\"}"))
    })

    DemoHandler := cors.Default().Handler(Demo_Mux)
    http.ListenAndServe(":3000", DemoHandler)
}

En el código anterior, cors.Default() configurará un middleware con opciones predeterminadas donde se aceptan todos los orígenes con métodos simples como GET y POST.

Vea la salida para el código anterior:

Salida CORS simple

Use los métodos GET y POST con CORS en Go

También podemos utilizar los métodos GET y POST para enviar la petición por CORS. Debemos asignarlos en el CORS usando el campo AllowedMethods.

Veamos el ejemplo:

package main

import (
    "net/http"

    "github.com/rs/cors"
)

func main() {

    Demo_Mux := http.NewServeMux()

    Demo_CORS := cors.New(cors.Options{
        AllowedOrigins:   []string{"*"}, //all
        AllowedMethods:   []string{http.MethodPost, http.MethodGet},
        AllowedHeaders:   []string{"*"}, //all
        AllowCredentials: false,         //none
    })

    Demo_Mux.HandleFunc("/delftstack", func(Response_Writer http.ResponseWriter, r *http.Request) {
        Response_Writer.Header().Set("Content-Type", "application/json")
        Response_Writer.Write([]byte("{\"hello!\": \"This is delftstack.com\"}"))
    })

    Demo_Handler := Demo_CORS.Handler(Demo_Mux)
    http.ListenAndServe(":3000", Demo_Handler)
}

El código anterior utilizará el paquete CORS para implementar la política y habilitar los dos métodos, GET y POST, para enviar la solicitud.

Ver la salida:

CORS OBTENER POST

Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook