在Gorilla Mux中配置CORS:POST请求中出现403错误

时间:2017-08-30 16:47:23

标签: reactjs post go http-post gorilla

我有一个API,目前正在尝试使用其中一个端点。端点用于POST请求,端点按预期工作。 API在云中运行,我使用protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity<Models.User>(entity => { entity.HasIndex(a => new { a.NormalizedUserName, a.TenantId }).HasName("UserNameIndex").IsUnique(); }); } 进行了测试,这是完美的,然后从我的反应应用程序我尝试使用它,但我得到curl

在浏览器的控制台中观察我发现我在OPTIONS请求中收到了该错误,并且POST永远不会完成。以下是控制台中显示的结果的屏幕截图:

enter image description here

然后,我创建了一个带有表单的简单HTML文件,在那里我放置了所需的输入,并且指向该端点的操作非常好用。然后,我不知道错误会在哪里?我在API中启用了CORS

在API中我使用的是Gorilla / mux,我有类似的东西:

403 status code

使用:

// Set up a router and some routes
    r := mux.NewRouter()
    r.HandleFunc("/", handleHome)
    //some other routes

    headersOk := handlers.AllowedHeaders([]string{"*"})
    originsOk := handlers.AllowedOrigins([]string{"*"})
    methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})

    // Start http server
    port := fmt.Sprintf(":%d", SomePort)
    http.ListenAndServe(port, handlers.CORS(originsOk, headersOk, methodsOk)(r))

我在浏览器中收到的消息是(西班牙语):

  

Solicitud desde otro origen bloqueada:lapolíticademismoorigen   ride el el recurso remoto en https://miURL(razón:falta la   cabecera CORS'Access-Control-Allow-Origin')。

英文:基本上服务器拒绝请求,因为CORS标头不存在。

那么,我在路由器配置中做错了什么?

2 个答案:

答案 0 :(得分:3)

使用rs/cors,您应该很容易解决CORS问题。

server.go

package main

import (
    . . .       
    "fmt"
    "log"
    "net/http"
    "github.com/gorilla/mux"
    "github.com/rs/cors"
    "../myhandler"
)

func main() {

fmt.Println("Settin up server, enabling CORS . . .")

  c := cors.New(cors.Options{
      AllowedOrigins: []string{"*"}, // All origins
      AllowedMethods: []string{"GET"}, // Allowing only get, just an example
  })

  router := mux.NewRouter()
  // Example handler
  router.HandleFunc("/test", myhandler.TestHandler())
  http.Handle("/", router)

  // Bind to port 8000 and pass our router in and pass the cors Handler
  log.Fatal(http.ListenAndServe(":8000"), c.Handler(router)))

  fmt.Println("Server is ready and is listening at port :8000 . . .")

}

在您的 testhandler.go 上,我们假设您要接受Content-Type: application/json

. . .

func TestHandler func(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)
    return
}

答案 1 :(得分:0)

解决方案:)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    //this is the solution
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

OR

   upgrader.CheckOrigin = func(r *http.Request) bool { return true } //this :)
   ws, err := upgrader.Upgrade(w,r,nil)