1

我正在使用 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 正在发送一个 OPTIONS 方法,我收到了 404 响应。任何帮助将不胜感激。

4

1 回答 1

1

代码注册 POST,但不注册 OPTIONS。一种方法是将代码更改为以下内容:

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)
 }

这将为所有处理程序添加 OPTIONS。另一种方法是将 Route Method 字段更改为Methods []string并将路由器创建为:

return router.Methods(route.Methods..., "OPTIONS").Path(route.Pattern).Name(route.Name).Handler(handler)

这将允许您将 OPTIONS 添加到处理程序的子集。

另一种方法是为 OPTIONS 注册一个单独的处理程序:

 Route{"saveConfig", "OPTIONS", "/saveConfig", preflight}
于 2015-07-14T17:40:04.543 回答