所以我用Go编写了这个RESTful后端,它将通过跨站点HTTP请求来调用,即从另一个站点(实际上,只是另一个端口,但是同源策略启动了,所以我们来了)提供的内容中调用。
在这种情况下,在某些情况下,用户代理将发送预检OPTIONS请求,以检查实际请求是否可以安全发送。
我的问题是如何在Go上下文中最好地处理和充分响应这些预检请求。我构想的方法感觉不太优雅,我想知道是否还有其他我没有想到的方法。
使用标准net/http包,我可以在处理程序函数中检查请求方法,也许像这样:
net/http
func AddResourceHandler(rw http.ResponseWriter, r *http.Request) { switch r.Method { case "OPTIONS": // handle preflight case "PUT": // respond to actual request } }
我还可以使用Gorilla的 mux程序包,并为每个相关的URL路径注册一个预检“ OPTIONS”处理程序。
mux
r := mux.NewRouter() r.HandleFunc("/someresource/item", AddResourceHandler).Methods("PUT") r.HandleFunc("/someresource/item", PreflightAddResourceHandler).Methods("OPTIONS")
也许对这个问题的回答很简单:是的 ,这些是您的基本选择。 但是我认为可能有一些我不知道的最佳实践。
分离逻辑并重新使用定义的CORS处理程序的一种简单方法是包装REST处理程序。例如,如果您使用的是net / http和该Handle方法,则可以始终执行以下操作:
Handle
func corsHandler(h http.Handler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if (r.Method == "OPTIONS") { //handle preflight in here } else { h.ServeHTTP(w,r) } } }
您可以这样包装:
http.Handle("/endpoint/", corsHandler(restHandler))