Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Reactjs 配置Gorilla Mux中的CORS:403 POST请求错误_Reactjs_Post_Go_Http Post_Gorilla - Fatal编程技术网

Reactjs 配置Gorilla Mux中的CORS:403 POST请求错误

Reactjs 配置Gorilla Mux中的CORS:403 POST请求错误,reactjs,post,go,http-post,gorilla,Reactjs,Post,Go,Http Post,Gorilla,我有一个API,目前正在尝试使用它的一个端点。端点用于POST请求,端点按预期工作。API在云中运行,我用curl对它进行了测试,它非常完美,然后从我的react应用程序中我尝试使用它,但我得到了403状态代码 在浏览器的控制台中观察,我发现我在一个选项请求中遇到了这个错误,而帖子从未完成。以下是控制台中显示的结果的屏幕截图: 然后,我用一个表单创建了一个简单的HTML文件,在那里我放置了所需的输入和指向该端点的操作,它运行得非常好。那么,我不知道哪里会出错?我已经在API中启用了CORS 在

我有一个API,目前正在尝试使用它的一个端点。端点用于POST请求,端点按预期工作。API在云中运行,我用
curl
对它进行了测试,它非常完美,然后从我的react应用程序中我尝试使用它,但我得到了
403状态代码

在浏览器的控制台中观察,我发现我在一个选项请求中遇到了这个错误,而帖子从未完成。以下是控制台中显示的结果的屏幕截图:

然后,我用一个表单创建了一个简单的HTML文件,在那里我放置了所需的输入和指向该端点的操作,它运行得非常好。那么,我不知道哪里会出错?我已经在API中启用了CORS

在API中,我使用的是Gorilla/mux,我有如下内容:

// 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))
使用:

"github.com/gorilla/mux"
"github.com/gorilla/handlers"
我在浏览器中收到的消息是(西班牙语):

布罗克达·奥特罗·奥里根律师事务所:米斯莫·奥里根律师事务所 在雷蒙(razón:falta la)的脑海中浮现出一个故事 cabecera CORS“访问控制允许原点”)

基本上,服务器拒绝请求是因为CORS头不存在

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

与您一起应该可以很容易地解决CORS问题

在您的服务器上。转到

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上,假设您想要接受
内容类型:application/json

. . .

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

这与reactjs无关,只是ajax和您的api。您正在发送什么请求头?如果发送除中列出的头以外的任何头,则会导致它预点燃请求,并且api会在选项请求上发送403。检查您的API。@cowbert正确!这是唯一被发送的标题,正如在评论中指出的,您的请求似乎在添加一个“
osn
”请求标题,同时添加一个访问控制允许来源,它肯定不需要添加-&这就是触发浏览器执行飞行前选项的原因。正如在另一个问题的评论中所提到的,问题是您的服务器向您发送请求的URL发出403 for OPTIONS请求。因此,您需要将后端配置为不需要对该路由的选项请求进行身份验证