为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
郎朗坤 2021-06-20 09:17:41
我正在尝试为多个处理程序设置一个 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")

如果我没记错的话,那应该可以编译并正常运行。


查看完整回答
反对 回复 2021-06-21
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

您不需要使用,*wr因为它已经引用了一个指针。

wr.Header().Set("Content-Type", "application/json") 应该足够了。

如果你想为每个请求设置“全局”标头,你可以创建一个满足的函数http.HandleFuncgo.auth 有一个很好的例子),然后像这样包装你的处理程序:

http.HandleFunc("/hello", Defaults(helloHandler))

另请查看net/http文档,其中包含更多示例


查看完整回答
反对 回复 2021-06-21
  • 3 回答
  • 0 关注
  • 217 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信