设置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)