在使用Context.ResponseWriter中的Set/WriteHeader/Write这三个方法时,使用顺序必须如下所示,否则会出现某一设置不生效的情况。
ctx.ResponseWriter.Header().Set('Content-type', 'application/text') ctx.ResponseWriter.WriteHeader(403) ctx.ResponseWriter.Write([]byte(resp))如1:
ctx.ResponseWriter.Header().Set('Content-type', 'application/text') ctx.ResponseWriter.Write([]byte(resp)) ctx.ResponseWriter.WriteHeader(403)
会导致返回码一直是200
补充:Go里w http.ResponseWriter,调用w.Write()方法报错
Go里w http.ResponseWriter写入报错
http: request method or response status code does not allow
1. 下面是报错截图2. 点进去Write方法它首先是一个接口;
由于它是在HTTP web服务器的应用场景,所以它具体的实现方法在net/http/server.go里:
func (w *response) Write(data []byte) (n int, err error) { return w.write(len(data), data, '')}
再点进去,函数里你会发现有一个关键的判断
// 其中ErrBodyNotAllowed的// 代码内容// ErrBodyNotAllowed = errors.New('http: request method or response status code does not allow body')if !w.bodyAllowed() { return 0, ErrBodyNotAllowed}
点进去,发现它在没有设置Header时会panic,当然这跟我们当前要讨论的问题关系不大,关键在bodyAllowedForStatus()方法
func (w *response) bodyAllowed() bool { if !w.wroteHeader { panic('') } return bodyAllowedForStatus(w.status)}
再点,终于看到了,当设置状态码为【100,199】、204、304就会报这个错,而我刚好设置的状态码就是204,我把它改成200重新试下,问题解决。
func bodyAllowedForStatus(status int) bool { switch { case status >= 100 && status <= 199: return false case status == 204: return false case status == 304: return false } return true}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持优爱好网。如有错误或未考虑完全的地方,望不吝赐教。
相关文章:
1. 怎么让div+css兼容ie6ie7ie8ie9和FireFoxChrome等浏览器2. requestAnimationFrame使用示例详解3. 基于JavaScript实现图片裁剪功能4. React优雅的封装SvgIcon组件示例5. uniapp自定义验证码输入框并隐藏光标6. 详解JavaScript中原始数据类型Symbol的使用7. JavaScript深拷贝方法structuredClone使用8. uniapp 手机验证码输入框实现代码(随机数、倒计时、隐藏手机号码中间四位)可以直接使用9. 使用Node.js实现Clean Architecture方法示例详解10. Jquery使用原生AJAX方法请求数据