Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
golang中http POST的飞行前问题_Http_Go_Http Headers_Cors_Preflight - Fatal编程技术网

golang中http POST的飞行前问题

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

我使用的是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.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无法加载。请求的资源上不存在“访问控制允许源代码”头。因此,不允许访问源代码“”。