戈兰 + CORS。全局设置不知何故?

标签 go cors

我正在尝试这个 Go 小例子 https://github.com/jakecoffman/golang-rest-bootstrap ,到目前为止一切顺利。

我正在尝试添加 CORS 以允许我的前端应用程序访问。

这是我的 Main.go

func main() {

    var err error

    session, err = r.Connect(r.ConnectOpts{
        Address:  "localhost:28015",
        Database: "demo",
        MaxOpen:  40,
    })
    if err != nil {
        log.Fatalln(err.Error())
    }

    r := mux.NewRouter()
    users.Init(r, session)
    accounts.Init(r, session)

    r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Access-Control-Allow-Origin", "*")
    })

    port := "9999" // os.Getenv("PORT")
    log.Println("Serving on", ":"+port)
    http.ListenAndServe(":"+port, context.ClearHandler(r))
}

它允许根 url 处的 CORS,但由于其他路由是在 Controller 中处理的,所以我似乎无法让 CORS 也在那里工作。

这是 AccountController 的一部分

func NewAccountController(r *mux.Router, s AccountService) *AccountController {
    cont := AccountController{s}
    r.Handle("/accounts", cont)
    r.Handle("/accounts/{id}", cont)

    return &cont
}

func (a AccountController) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    code := http.StatusMethodNotAllowed
    var data interface{}

    defer func(c int) {
        log.Println(r.URL, "-", r.Method, "-", code, r.RemoteAddr)
    }(code)

    if r.URL.Path == "/accounts" {
        switch r.Method {
        case "GET":
            code, data = a.List(w, r)
        case "POST":
            code, data = a.Add(w, r)
        default:
            return
        }
    } else {
        switch r.Method {
        case "GET":
            code, data = a.Get(w, r)
        case "PUT":
            code, data = a.Update(w, r)
        case "DELETE":
            code, data = a.Delete(w, r)
        default:
            return
        }
    }

    w.WriteHeader(code)
    w.Header().Set("Content-Type", "application/json")

    err := json.NewEncoder(w).Encode(data)
    if err != nil {
        log.Println("Failed to write data: ", err)
        code = http.StatusInternalServerError
    }
}

任何想法或指示都会很棒。

谢谢,

JB

最佳答案

您可以为此制作一个简单的中间件:

type CORSMiddleware struct {
    http.Handler
}

func (cm CORSMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")
    cm.Handler.ServeHTTP(w, r)
}

然后,你可以像这样使用它:

var h http.Handler = CORSMiddleware{cont}
r.Handle("/accounts", h)
r.Handle("/accounts/{id}", h)

关于戈兰 + CORS。全局设置不知何故?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30325483/

相关文章:

javascript - Express 服务器和 Axios CORS Preflight 响应不成功

javascript - Express和 Node : CORS fails

go - 在索引处插入元素并按值删除数组中的元素

function - go 的 len() 和 make() 函数是如何工作的?

string - 我可以使用 make 或 new 在 golang 中制作预填充字符串吗?

java - IntelliJ 静态 Web 项目到 Tomcat 或 Angular COR

json - Go:在 for 循环中使用 JSON Unmarshal

Golang CLI 眼镜蛇计数标志

javascript - IE 中的 jQuery 跨域发布与数据

javascript - 有什么方法可以快速确定浏览器是否支持支持 CORS 的图像而不污染浏览器?