我正在尝试为多个处理程序设置一个 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) }}
3 回答
jeck猫
TA贡献1909条经验 获得超7个赞
我不确定多处理程序的事情,但我知道为什么你写的代码失败了。关键是这一行:
*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")
如果我没记错的话,那应该可以编译并正常运行。
杨__羊羊
TA贡献1943条经验 获得超7个赞
您不需要使用,*wr
因为它已经引用了一个指针。
wr.Header().Set("Content-Type", "application/json")
应该足够了。
如果你想为每个请求设置“全局”标头,你可以创建一个满足的函数http.HandleFunc
(go.auth 有一个很好的例子),然后像这样包装你的处理程序:
http.HandleFunc("/hello", Defaults(helloHandler))
另请查看net/http
文档,其中包含更多示例。
- 3 回答
- 0 关注
- 217 浏览
添加回答
举报
0/150
提交
取消