Yönlendiricinizi geçersiz kılmak istemiyorsanız (uygulamanızı bunu destekleyecek şekilde yapılandırmadıysanız veya CORS'yi rota bazında yapılandırmak istiyorsanız), uçuş öncesi isteğini işlemek için bir OPTIONS işleyicisi ekleyin .
Yani, Gorilla Mux ile rotalarınız şöyle görünecektir:
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
Yukarıda, POST işleyicimize ek olarak, belirli bir OPTIONS yöntem işleyicisi tanımladığımızı unutmayın .
Sonra OPTIONS ön kontrol yöntemini gerçek olarak işlemek için, AccountsCreatePreFlight öğesini şu şekilde tanımlayabilirsiniz:
// Check the origin is valid.
origin := r.Header.Get("Origin")
validOrigin, err := validateOrigin(origin)
if err != nil {
return err
}
// If it is, allow CORS.
if validOrigin {
w.Header().Set("Access-Control-Allow-Origin", origin)
w.Header().Set("Access-Control-Allow-Methods", "POST")
w.Header().Set("Access-Control-Allow-Headers",
"Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}
Bunu gerçekten benim için yapan şey (CORS'in nasıl çalıştığını anlamaya ek olarak), bir ön kontrol isteğinin HTTP Yönteminin, gerçek isteğin HTTP Yönteminden farklı olmasıdır. CORS'yi başlatmak için tarayıcı, yönlendiricinizde açıkça işlemeniz gereken HTTP Yöntemi SEÇENEKLERİ ile bir ön kontrol isteği gönderir ve ardından uygulamanızdan uygun yanıtı "Access-Control-Allow-Origin": origin
(veya herkes için "*") alırsa , gerçek istek.
Ben de sadece standart istek türleri için "*" yapabileceğinize inanıyorum (yani: GET), ancak diğerleri için yukarıda yaptığım gibi açıkça kökeni ayarlamak zorunda kalacak.
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")