Jika Anda tidak ingin mengganti router Anda (jika Anda tidak memiliki aplikasi yang dikonfigurasi dengan cara yang mendukung ini, atau ingin mengkonfigurasi CORS pada rute dengan basis rute), tambahkan penangan OPSI untuk menangani permintaan pra penerbangan .
Yaitu, dengan Gorilla Mux rute Anda akan terlihat seperti:
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
Perhatikan di atas bahwa selain penangan POST kami, kami mendefinisikan penangan metode OPTIONS tertentu .
Dan kemudian untuk menangani metode preflight OPSI yang sebenarnya, Anda dapat mendefinisikan AccountsCreatePreFlight seperti:
// 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")
}
Apa yang benar-benar membuat ini semua klik untuk saya (selain benar-benar memahami cara kerja CORS) adalah bahwa Metode HTTP dari permintaan preflight berbeda dari Metode HTTP dari permintaan aktual. Untuk memulai CORS, browser mengirimkan permintaan preflight dengan HTTP Method OPTIONS, yang harus Anda tangani secara eksplisit di router Anda, dan kemudian, jika ia menerima respons yang sesuai "Access-Control-Allow-Origin": origin
(atau "*" untuk semua) dari aplikasi Anda, browser akan memulai aktual permintaan.
Saya juga percaya bahwa Anda hanya dapat melakukan "*" untuk jenis permintaan standar (yaitu: GET), tetapi untuk yang lain Anda harus menetapkan secara eksplisit asal seperti yang saya lakukan di atas.
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")