golang中http POST的飞行前问题
我使用的是mux软件包,代码如下:golang中http POST的飞行前问题,http,go,http-headers,cors,preflight,Http,Go,Http Headers,Cors,Preflight,我使用的是mux软件包,代码如下: func saveConfig(w http.ResponseWriter, r *http.Request) { if origin := r.Header.Get("Origin"); origin != "" { w.Header().Set("Access-Control-Allow-Origin", origin) fmt.Println("Origin: " + origin) w.Heade
func saveConfig(w http.ResponseWriter, r *http.Request) {
if origin := r.Header.Get("Origin"); origin != "" {
w.Header().Set("Access-Control-Allow-Origin", origin)
fmt.Println("Origin: " + origin)
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}
// Stop here if its Preflighted OPTIONS request
if r.Method == "OPTIONS" {
return
}
body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1048576))
if err != nil {
fmt.Println("Error: %s\n", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
fmt.Println("JSON body:" + string(body))
if err := r.Body.Close(); err != nil {
panic(err)
}
w.WriteHeader(http.StatusCreated)
}
它在IE上运行良好,但chrome preflight正在发送一个选项方法,我得到了404响应。任何帮助都将不胜感激。代码注册为POST,但不是选项。一种方法是将代码更改为以下内容:
func NewRouter() *mux.Router {
router := mux.NewRouter().StrictSlash(true)
for _, route := range routes {
var handler http.Handler
handler = route.HandlerFunc
handler = commonlibrary.Logger(handler, route.Name)
return router.Methods(route.Method, "OPTIONS").Path(route.Pattern).Name(route.Name).Handler(handler)
}
这将向所有处理程序添加选项。另一种方法是将路由方法字段更改为Methods[]string
,并将路由器创建为:
return router.Methods(route.Methods..., "OPTIONS").Path(route.Pattern).Name(route.Name).Handler(handler)
这将允许您向处理程序的子集添加选项
另一种方法是为选项注册单独的处理程序:
Route{"saveConfig", "OPTIONS", "/saveConfig", preflight}
404可能意味着它找不到处理器。检查所请求的路径是否与处理程序的路由匹配。请求头:Accept:*/*接受编码:gzip,deflate,sdch接受语言:en-US,en;q=0.8访问控制请求头:接受,内容类型访问控制请求方法:POST连接:保持活动主机:本地主机:8080来源:引用:用户代理:Mozilla/5.0(Windows NT 6.3;WOW64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/42.0.2311.90 Safari/537.36显示用于注册路线的代码和从浏览器输入的URL。此外,请使用而不是io.LimitReader。io.LimitReader不会阻止服务器访问整个请求正文。如果我将方法从路由器中的POST to选项更改为,我将获得状态代码200func NewRouter()*mux.router{router:=mux.NewRouter().stritslash(true),用于x,route:=范围路由{var handler http.handler handler=route.HandlerFunc//handler=commonlibrary.Logger(handler,route.Name)router.Methods(route.Method).Path(route.Pattern.Name(route.Name).handler(handler)}返回路由器}我使用了以下选项:路由{“saveConfig”,“options”,“/saveConfig”,“preflight}现在,如果我从Angularjs$http.post(“”,data=JSON.stringify(custconfig))调用,我得到的是http/1.1200,但它没有调用post。看起来只有从客户端调用了选项。这是我的preflightcode:func saveConfigPreFlight(w http.ResponseWriter,r*http.Request){if origin:=r.Header.Get(“origin”);origin==“w.Header().Set”(“访问控制允许origin”,origin)w.Header().Set(“访问控制允许方法”,“POST”)w.Header().Set(“访问控制允许头”,“接受,内容类型,内容长度,接受编码,X-CSRF-Token,授权”)}//如果预引导选项请求,则停止此处,如果r.Method==“选项”{return}saveConfig(w,r)}从飞行前处理程序中删除了saveConfig(w,r),POST现在工作正常。但在Chrome上我仍然看到错误:1 XMLHttpRequest无法加载。请求的资源上不存在“访问控制允许源代码”头。因此,不允许访问源代码“”。