在 go 中为多个处理程序设置 http 标头

我正在尝试为多个处理程序设置一个 http 标头。我的第一个想法是制作一个自定义写入函数,该函数将在编写响应之前设置标题,如底部的代码示例。


但是,当我传递一个指向 http.ResponseWriter 的指针并尝试从我的函数访问它时,它告诉我“类型 *http.ResponseWriter 没有 Header 方法”。


为多个处理程序设置标头的最佳方法是什么,以及为什么指针不能按我希望的方式工作?


func HelloServer(w http.ResponseWriter, req *http.Request) {

    type Message struct {

        Name string

        Body string

        Time int64

    }


    m := Message{"Alice", "Hello", 1294706395881547000}


    b, _ := json.Marshal(m)

    WriteJSON(&w, b)

}


func WriteJSON(wr *http.ResponseWriter, rawJSON []byte) {

    *wr.Header().Set("Content-Type", "application/json")


    io.WriteString(*wr, string(rawJSON))

}


func main() {

    http.HandleFunc("/json", HelloServer)


    err := http.ListenAndServe(":9000", nil)

    if err != nil {

    log.Fatal("ListenAndServer: ", err)

    }

}


郎朗坤
浏览 218回答 3
3回答

jeck猫

我不确定多处理程序的事情,但我知道为什么你写的代码失败了。关键是这一行:*wr.Header().Set("Content-Type", "application/json")由于运算符优先级,被解释为:*(wr.Header().Set("Content-Type", "application/json"))由于wr有型*http.ResponseWriter,这是一个指针,以和接口,而不是接口本身,这是不行的。我假设您知道这一点,这就是您这样做的原因*wr。我假设您要向编译器暗示的是:(*wr).Header().Set("Content-Type", "application/json")如果我没记错的话,那应该可以编译并正常运行。

杨__羊羊

您不需要使用,*wr因为它已经引用了一个指针。wr.Header().Set("Content-Type", "application/json") 应该足够了。如果你想为每个请求设置“全局”标头,你可以创建一个满足的函数http.HandleFunc(go.auth 有一个很好的例子),然后像这样包装你的处理程序:http.HandleFunc("/hello", Defaults(helloHandler))另请查看net/http文档,其中包含更多示例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go