解决Golang中ResponseWriter的一个坑


Posted in Golang onApril 27, 2021

在使用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. 下面是报错截图

解决Golang中ResponseWriter的一个坑

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
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
go语言求任意类型切片的长度操作
Apr 26 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
golang内置函数len的小技巧
Jul 25 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
golang在GRPC中设置client的超时时间
golang http使用踩过的坑与填坑指南
Apr 27 #Golang
Golang 实现超大文件读取的两种方法
Apr 27 #Golang
golang中的空slice案例
Apr 27 #Golang
Go语言切片前或中间插入项与内置copy()函数详解
golang中切片copy复制和等号复制的区别介绍
Apr 27 #Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 #Golang
You might like
php使用session二维数组实例
2014/11/06 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
2017/06/09 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
Vue中props的详解
2019/05/16 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
HTML5微信播放全屏问题的解决方法
2017/03/09 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
办公室副主任岗位职责
2013/11/25 职场文书
大学同学聚会邀请函
2014/01/19 职场文书
《落花生》教学反思
2014/02/25 职场文书
加入学生会演讲稿
2014/04/24 职场文书
爱情保证书大全
2014/04/29 职场文书
淘宝店策划方案
2014/06/07 职场文书
超市理货员岗位职责
2014/07/04 职场文书
《角的度量》教学反思
2016/02/18 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书