【问题标题】:facing cors issue in golang server在 golang 服务器中面临 cors 问题
【发布时间】:2019-12-22 20:04:09
【问题描述】:

我已经在我的 Go 服务器中编写了这段代码:

func main() {
    r := chi.NewRouter()
    cors := cors.New(cors.Options{
        AllowedOrigins:     []string{"*"},
        AllowOriginFunc:    func(r *http.Request, origin string) bool { return true },
        AllowedMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
        AllowedHeaders:     []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"},
        ExposedHeaders:     []string{"Link"},
        AllowCredentials:   true,
        OptionsPassthrough: true,
        MaxAge:             3599, // Maximum value not ignored by any of major browsers
    })
    flag.Parse()

    // A good base middleware stack
    r.Use(cors.Handler)
    r.Use(middleware.RequestID)
    r.Use(middleware.Logger)
    r.Use(middleware.Recoverer)
    r.Use(middleware.URLFormat)
    r.Use(render.SetContentType(render.ContentTypeJSON))
    r.Use(middleware.Timeout(60 * time.Second))

    r.Group(func(r chi.Router) {

        r.Route("/api", func(r chi.Router) {
            r.Route("/items", func(r chi.Router) {
                r.Get("/", allItems)
                r.Route("/{barcode}", func(r chi.Router) {
                    r.Get("/", getItem)
                    r.Put("/", updateItem)
                })
                r.Post("/", postItem)
                r.Delete("/", deleteItem)
            })

            r.Route("/sale_lines", func(r chi.Router) {
                //  r.Use(cors.Handler)
                r.Post("/", postSales)
                r.Put("/", updateSales)
                r.Delete("/", deleteSales)

            })
        })
    })
    http.ListenAndServe(":8080", r)
}

我面临的问题是,当我从我的 react 应用程序调用 api 时,它给了我这样的错误:

从源“http://localhost:3000”访问“http://localhost:8080/api/sale_lines”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态。

我错过了什么问题?

【问题讨论】:

  • 请将您的代码格式化为也可读。
  • 它所指的“预检请求”是一个 HTTP OPTIONS 请求;基本上,错误是说当它发出原始 OPTIONS 请求以查看是否允许使用 CORS 时,它没有得到 200 返回,它得到了其他东西。您可以通过使用 curl 或 Postman 之类的方式向该 URL 发出 OPTIONS 请求来查看它得到的确切响应,这应该有助于缩小问题范围。
  • @Adrian 我从邮递员那里检查过,它返回了 ok 状态,但我的 react 应用程序仍然显示上述错误

标签: http go cors


【解决方案1】:

您的错误一定出在您的某些中间件上。探针和您的代码工作正常,只需将 AllowOriginFunc 的名称从 CORS 选项更改为 AllowOriginRequestFunc

服务器代码:

package main

import (
    "net/http"

    "github.com/go-chi/chi"
    "github.com/rs/cors"
)

func main() {
    r := chi.NewRouter()
    cors := cors.New(cors.Options{
        AllowedOrigins:         []string{"*"},
        AllowOriginRequestFunc: func(r *http.Request, origin string) bool { return true },
        AllowedMethods:         []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
        AllowedHeaders:         []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"},
        ExposedHeaders:         []string{"Link"},
        AllowCredentials:       true,
        OptionsPassthrough:     true,
        MaxAge:                 3599, // Maximum value not ignored by any of major browsers
    })

    r.Use(cors.Handler)

    r.Get("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello World"))
    })
    http.ListenAndServe(":8080", r)
}

我使用 XMLHttpRequest 对其进行了测试:

<div id="root"></div>
<script>
  var req = new XMLHttpRequest();
  req.open("GET", "http://localhost:8080/", false);
  req.onload = function(event) {
    if (req.readyState == 4 && req.status == 200)
      document.getElementById("root").innerText = req.responseText;
  };
  req.send();
</script>

【讨论】:

  • 我执行了你的建议,但它给了我这个错误:cors.Options 类型的结构文字中的未知字段'AllowOriginRequestFunc'
  • 我使用的版本是v1.0.7
猜你喜欢
  • 2018-05-25
  • 1970-01-01
  • 2021-12-07
  • 2021-04-25
  • 2022-01-24
  • 2017-10-27
  • 2015-12-03
  • 2015-10-14
  • 2019-06-22
相关资源
最近更新 更多