Nếu bạn không muốn ghi đè bộ định tuyến của mình (nếu bạn không cấu hình ứng dụng của mình theo cách hỗ trợ điều này hoặc muốn định cấu hình CORS trên tuyến theo cơ sở tuyến đường), hãy thêm trình xử lý TÙY CHỌN để xử lý yêu cầu chuyến bay trước .
Tức là, với Gorilla Mux, các tuyến đường của bạn sẽ như sau:
accounts := router.Path("/accounts").Subrouter()
accounts.Methods("POST").Handler(AccountsCreate)
accounts.Methods("OPTIONS").Handler(AccountsCreatePreFlight)
Lưu ý ở trên rằng ngoài trình xử lý POST của chúng tôi, chúng tôi đang xác định một trình xử lý phương thức TÙY CHỌN cụ thể .
Và sau đó để thực sự xử lý phương thức preflight TÙY CHỌN, bạn có thể định nghĩa AccountCreatePreFlight như sau:
// 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")
}
Điều thực sự làm cho tất cả điều này nhấp vào tôi (ngoài việc thực sự hiểu cách thức hoạt động của CORS) là Phương thức HTTP của yêu cầu preflight khác với Phương thức HTTP của yêu cầu thực tế. Để khởi tạo CORS, trình duyệt gửi yêu cầu preflight với CHỌN Phương thức HTTP, mà bạn phải xử lý rõ ràng trong bộ định tuyến của mình và sau đó, nếu nó nhận được phản hồi thích hợp "Access-Control-Allow-Origin": origin
(hoặc "*" cho tất cả) từ ứng dụng của bạn, nó sẽ khởi tạo thực tế yêu cầu.
Tôi cũng tin rằng bạn chỉ có thể thực hiện "*" cho các loại yêu cầu tiêu chuẩn (ví dụ: GET), nhưng đối với những người khác, bạn sẽ phải đặt rõ ràng nguồn gốc như tôi làm ở trên.
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")