Якщо ви не хочете змінювати маршрутизатор (якщо у вас немає програми, налаштованої таким чином, або ви хочете налаштувати CORS на маршруті за маршрутом), додайте обробник OPTIONS для обробки запиту перед польотом .
Тобто, з Gorilla Mux ваші маршрути виглядали б так:
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
Зауважте вище, що крім нашого обробника POST, ми визначаємо конкретний обробник методу OPTIONS .
А потім, щоб фактично обробити метод передпольоту OPTIONS, ви можете визначити AccountsCreatePreFlight так:
// 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")
}
Що насправді змусило все це натиснути для мене (окрім того, що насправді розуміє, як працює CORS), це те, що метод HTTP запиту перед польотом відрізняється від методу HTTP фактичного запиту. Щоб ініціювати CORS, браузер надсилає запит на попередній політ за допомогою методу HTTP OPTIONS, з яким вам потрібно явно обробити свій маршрутизатор, а потім, якщо він отримає відповідну відповідь "Access-Control-Allow-Origin": origin
(або "*" для всіх) від вашої програми, він ініціює фактичну запит.
Я також вважаю, що ви можете робити "*" тільки для стандартних типів запитів (тобто: GET), але для інших вам потрібно буде чітко встановити походження, як я, як це я робив вище.
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")