解决Golang中ResponseWriter的一个坑
程序员文章站
2022-06-25 18:38:26
在使用context.responsewriter中的set/writeheader/write这三个方法时,使用顺序必须如下所示,否则会出现某一设置不生效的情况。ctx.responsewriter...
在使用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 }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
下一篇: 重装WINDOWS后引导红旗linux
推荐阅读
-
Golang mysql 上线的一个坑 Db.close重要性
-
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
-
fixed在移动端开发中遇到的坑及解决办法
-
python中from module import * 的一个坑
-
asp解决“另一个SqlParameterCollection中已包含SqlParameter”的方法
-
python的函数定义中99%的人会遇到的一个坑
-
浅谈Golang中创建一个简单的服务器的方法
-
解决Pyinstaller打包软件失败的一个坑
-
解决一个android studio 3.0升级问题:原来module中的包没法引用
-
Android开发过程中的坑及解决方法收录(四)