解决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中semaphore(信号量)源码
Apr 03 Golang
Golang二维切片初始化的实现
Apr 08 Golang
为什么不建议在go项目中使用init()
Apr 12 Golang
go:垃圾回收GC触发条件详解
Apr 24 Golang
go语言-在mac下brew升级golang
Apr 25 Golang
Golang 正则匹配效率详解
Apr 25 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
golang操作rocketmq的示例代码
Apr 06 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通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
由document.body和document.documentElement想到的
2009/04/13 Javascript
JS 判断代码全收集
2009/04/28 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
js HTML5 Canvas绘制转盘抽奖
2020/09/13 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
jQuery实现导航回弹效果
2017/02/27 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
vue.js异步上传文件前后端实现代码
2017/08/22 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
Python使用googletrans报错的解决方法
2018/09/25 Python
python列表推导式操作解析
2019/11/26 Python
Python ATM功能实现代码实例
2020/03/19 Python
如何验证python安装成功
2020/07/06 Python
python db类用法说明
2020/07/07 Python
Pycharm如何自动生成头文件注释
2020/11/14 Python
《鞋匠的儿子》教学反思
2014/03/02 职场文书
机电一体化求职信
2014/03/10 职场文书
聚美优品广告词改编
2014/03/14 职场文书
初中家长寄语
2014/04/02 职场文书
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
公司股东合作协议书
2014/09/14 职场文书
怎样写辞职信
2015/02/27 职场文书
早会开场白台词大全
2015/06/01 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript