Golang 设置 http response 响应头的坑

Golang http set response header

Posted by alovn on January 20, 2020

设置WriteHeader的顺序问题

写grpc proxy gateway的时候遇到一个问题,在代码中这样设置WriteHeader,最后在response header中获取到的Content-Type却是 text/plain; charset=utf-8; 可见设置header是失败的:

1
2
3
writer.WriteHeader(http.StatusOK)
writer.Header().Set("Content-Type", "application/json")
writer.Write(res)

原来如果要同时设置w.WriteHeader 和 w.Header.Set 这两种,就必须让 w.WriteHeader 在所有的 w.Header.Set 之后,因为 w.WriteHeader 后 Set Header 是无效的。

而且必须是在 w.Write([]byte(“OK”)) 之前,否则会抛出异常:

1
http: multiple response.WriteHeader calls

因为其实调用w.Write的时候也会调用WriteHeader()方法,会将w.wroteHeader置为true。再次调WriteHeader()则会判断wroteHeader,如果是true则会报错,而且本次调用不生效。

正确的顺序:

1
2
3
writer.Header().Set("Content-Type", "application/json")
writer.WriteHeader(http.StatusOK)
writer.Write(res)