解决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 相关文章推荐
golang 实现两个结构体复制字段
Apr 28 Golang
golang goroutine顺序输出方式
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang 链表的学习和使用
Apr 19 Golang
深入理解 Golang 的字符串
May 04 Golang
Golang实现可重入锁的示例代码
May 25 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
浅析php面向对象public private protected 访问修饰符
2013/06/30 PHP
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
2013/07/01 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
2019/10/16 PHP
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
js获取location.href的参数实例代码
2013/08/02 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
VueJs监听window.resize方法示例
2018/01/17 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
python实现最大优先队列
2019/08/29 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
python中如何打包用户自定义模块
2020/09/23 Python
海淘母婴商城:国际妈咪
2016/07/23 全球购物
请写出 BOOL flag 与"零值"比较的 if 语句
2016/02/29 面试题
Python面试题:如何用Python来发送邮件
2016/03/15 面试题
个人简历自荐信
2013/12/05 职场文书
酒店管理求职信范文
2014/04/06 职场文书
体育口号大全
2014/06/18 职场文书
协议书范文
2015/01/27 职场文书
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python