Estoy tratando de establecer un encabezado en mi servidor web Go. Estoy usando gorilla/mux
y net/http
paquetes.
Me gustaría configurar Access-Control-Allow-Origin: *
para permitir el dominio cruzado AJAX.
Aquí está mi código Go:
func saveHandler(w http.ResponseWriter, r *http.Request) {
// do some stuff with the request data
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/save", saveHandler)
http.Handle("/", r)
http.ListenAndServe(":"+port, nil)
}
El net/http
paquete tiene documentación que describe el envío de encabezados de solicitud http como si fuera un cliente. ¿No estoy exactamente seguro de cómo configurar encabezados de respuesta?
http
go
cors
http-headers
zen
fuente
fuente
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")
withCredentials:true
(el valor "*" no está permitido cuando se envían credenciales, que es un caso de uso común). Debe establecer el origen del solicitante (consulte la respuesta de Matt Bucci a continuación para saber cómo).Todas las respuestas anteriores son incorrectas porque no pueden manejar la solicitud de verificación previa de OPTIONS, la solución es anular la interfaz del enrutador mux. Consulte AngularJS $ http solicitud fallida con encabezado personalizado (permitido en CORS)
fuente
Access-Control-Allow-Credentials": "true"
solicitudes con httpOnly Cookies.No use '*' para Origin, hasta que realmente necesite un comportamiento completamente público.
Como dice Wikipedia :
Eso significa que obtendrá muchos errores, especialmente en Chrome cuando intente implementar, por ejemplo, una autenticación simple.
Aquí hay un contenedor corregido:
Y no olvide responder todos estos encabezados a la solicitud OPTIONS de verificación previa.
fuente
router.HandleFunc("/user/action", user.UserAction) http.Handle("/", router) http.ListenAndServe(":8080", nil).Set("Access-Control-Allow-Origin", "*")
router.HandleFunc("/user/action", addDefaultHeaders(user.UserAction))
sin embargo, como tengo alrededor de 16 rutas, esto no es ideal, ¿hay alguna manera de especificarlo como un envoltorio en el paquete http o la capa de enrutador muxEstablezca un middleware golang adecuado, para que pueda reutilizar en cualquier punto final.
Tipo de ayuda y función
Middleware real
Punto final
¡RECUERDA! Los middlewares se aplican en orden inverso (ExpectGET () se activa primero)
fuente
Si no desea anular su enrutador (si no tiene su aplicación configurada de una manera que lo admita, o si desea configurar CORS ruta por ruta), agregue un controlador de OPCIONES para manejar la solicitud previa al vuelo .
Es decir, con Gorilla Mux tus rutas se verían así:
Tenga en cuenta que además de nuestro controlador POST, estamos definiendo un controlador de método OPTIONS específico .
Y luego, para manejar el método de verificación previa OPTIONS, puede definir CuentasCreatePreFlight de la siguiente manera:
Lo que realmente hizo que todo esto fuera un clic para mí (además de comprender realmente cómo funciona CORS) es que el Método HTTP de una solicitud de verificación previa es diferente del Método HTTP de la solicitud real. Para iniciar CORS, el navegador envía una solicitud de verificación previa con las OPCIONES del Método HTTP, que debe manejar explícitamente en su enrutador, y luego, si recibe la respuesta adecuada
"Access-Control-Allow-Origin": origin
(o "*" para todos) de su aplicación, inicia la aplicación real solicitud.También creo que solo puede hacer "*" para los tipos estándar de solicitudes (es decir: GET), pero para otros tendrá que establecer explícitamente el origen como lo hice anteriormente.
fuente
Creo envoltura para este caso:
fuente
Tuve el mismo problema que el descrito anteriormente, las soluciones dadas anteriormente son correctas, la configuración que tengo es la siguiente 1) Angularjs para el Cliente 2) Marco de Beego para el servidor GO
Siga estos puntos 1) La configuración de CORS debe estar habilitada solo en el servidor GO 2) NO agregue ningún tipo de encabezados en angularJS excepto esto
En su servidor GO, agregue la configuración CORS antes de que la solicitud comience a procesarse para que la solicitud de verificación previa reciba un 200 OK luego de lo cual el método OPTIONS se convertirá en GET, POST, PUT o el tipo de solicitud que sea.
fuente
Sé que este es un giro diferente en la respuesta, pero ¿no es esto más una preocupación para un servidor web? Por ejemplo, nginx , podría ayudar.
Agregar nginx frente a su servicio go en producción parece una buena idea. Proporciona muchas más funciones para autorizar, registrar y modificar solicitudes. Además, le da la capacidad de controlar quién tiene acceso a su servicio y no solo eso, sino que también puede especificar un comportamiento diferente para ubicaciones específicas en su aplicación, como se demostró anteriormente.
Podría seguir explicando por qué usar un servidor web con su api go, pero creo que ese es un tema para otra discusión.
fuente