หากคุณไม่ต้องการแทนที่เราเตอร์ของคุณ (หากคุณไม่ได้กำหนดค่าแอพของคุณในลักษณะที่รองรับสิ่งนี้หรือต้องการกำหนดค่า CORS บนเส้นทางตามเส้นทางพื้นฐาน) เพิ่มตัวจัดการ OPTIONS เพื่อจัดการคำขอเที่ยวบินล่วงหน้า .
เช่นด้วย Gorilla Mux เส้นทางของคุณจะมีลักษณะดังนี้:
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
หมายเหตุข้างต้นว่านอกเหนือจากการจัดการโพสต์ของเราที่เรากำลังกำหนดวิธีการจัดการตัวเลือกที่เฉพาะเจาะจง
จากนั้นเพื่อจัดการกับวิธี preflight ตัวเลือกจริงคุณสามารถกำหนด 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 ของคำขอ preflight นั้นแตกต่างจากวิธี HTTP ของคำขอจริง ในการเริ่มต้น CORS เบราว์เซอร์จะส่งคำขอ preflight ด้วย HTTP Method OPTIONS ซึ่งคุณต้องจัดการอย่างชัดเจนในเราเตอร์ของคุณและจากนั้นหากได้รับการตอบสนองที่เหมาะสม"Access-Control-Allow-Origin": origin
(หรือ "*" สำหรับทุกคน) จากแอปพลิเคชันของคุณ ขอร้อง
ฉันเชื่อว่าคุณสามารถทำได้เพียง "*" สำหรับประเภทคำขอมาตรฐาน (เช่น: GET) แต่สำหรับคนอื่นคุณจะต้องตั้งค่าต้นกำเนิดอย่างชัดเจนเช่นเดียวกับข้างต้น
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")