首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >设置HTTP标头

设置HTTP标头
EN

Stack Overflow用户
提问于 2012-10-11 07:39:13
回答 5查看 133.4K关注 0票数 173

我正在尝试在我的Go web服务器中设置一个头文件。我使用的是gorilla/muxnet/http包。

我想将Access-Control-Allow-Origin: *设置为允许跨域AJAX。

这是我的Go代码:

代码语言:javascript
复制
func saveHandler(w http.ResponseWriter, r *http.Request) {
// do some stuff with the request data
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/save", saveHandler)
    http.Handle("/", r)
    http.ListenAndServe(":"+port, nil)
}

net/http包中的文档描述了发送http请求头,就好像它是一个客户端一样--我不太确定如何设置响应头?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-11 07:46:18

不要紧,我想通了--我在Header()上使用了Set()方法(哦!)

我的处理程序现在看起来像这样:

代码语言:javascript
复制
func saveHandler(w http.ResponseWriter, r *http.Request) {
    // allow cross domain AJAX requests
    w.Header().Set("Access-Control-Allow-Origin", "*")
}

也许这会在某一天对像我这样缺乏咖啡因的人有所帮助:)

票数 239
EN

Stack Overflow用户

发布于 2014-07-18 14:37:52

以上所有答案都是错误的,因为它们无法处理OPTIONS印前检查请求,解决方案是覆盖多路复用路由器的接口。请参阅AngularJS $http get request failed with custom header (alllowed in CORS)

代码语言:javascript
复制
func main() {
    r := mux.NewRouter()
    r.HandleFunc("/save", saveHandler)
    http.Handle("/", &MyServer{r})
    http.ListenAndServe(":8080", nil);

}

type MyServer struct {
    r *mux.Router
}

func (s *MyServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
    if origin := req.Header.Get("Origin"); origin != "" {
        rw.Header().Set("Access-Control-Allow-Origin", origin)
        rw.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
        rw.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 req.Method == "OPTIONS" {
        return
    }
    // Lets Gorilla work
    s.r.ServeHTTP(rw, req)
}
票数 98
EN

Stack Overflow用户

发布于 2016-05-10 20:25:16

设置一个合适的golang中间件,这样您就可以在任何端点上重用。

Helper类型和函数

代码语言:javascript
复制
type Adapter func(http.Handler) http.Handler
// Adapt h with all specified adapters.
func Adapt(h http.Handler, adapters ...Adapter) http.Handler {
    for _, adapter := range adapters {
        h = adapter(h)
    }
    return h
}

实际的中间件

代码语言:javascript
复制
func EnableCORS() Adapter {
    return func(h http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

            if origin := r.Header.Get("Origin"); origin != "" {
                w.Header().Set("Access-Control-Allow-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
            }
            h.ServeHTTP(w, r)
        })
    }
}

端点

记住!中间件按相反顺序应用( ExpectGET()首先触发)

代码语言:javascript
复制
mux.Handle("/watcher/{action}/{device}",Adapt(api.SerialHandler(mux),
    api.EnableCORS(),
    api.ExpectGET(),
))
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12830095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档