解决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中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
对Golang中的FORM相关字段理解
May 02 Golang
golang 比较浮点数的大小方式
May 02 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
go xorm框架的使用
May 22 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Go语言编译原理之变量捕获
Aug 05 Golang
Go语言编译原理之源码调试
Aug 05 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编程与应用
2006/10/09 PHP
我的群发邮件程序
2006/10/09 PHP
使用php4加速网络传输
2006/10/09 PHP
用PHP将网址字符串转换成超链接(网址或email)
2010/05/25 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
Ajax+Jpgraph实现的动态折线图功能示例
2019/02/11 PHP
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
jquery validate demo 基础
2015/10/29 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
python 文件和路径操作函数小结
2009/11/23 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
pip命令无法使用的解决方法
2018/06/12 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
python 字典 setdefault()和get()方法比较详解
2019/08/07 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
用python对oracle进行简单性能测试
2020/12/05 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
服装机修工岗位职责
2013/12/26 职场文书
最新的互联网创业计划书
2014/01/10 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
高中国旗下的演讲稿
2014/08/28 职场文书
课外访万家心得体会
2014/09/03 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
高三英语教学计划
2015/01/23 职场文书
北京故宫的导游词
2015/01/31 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书
素质教育培训心得体会
2016/01/19 职场文书
HTML中的表格元素介绍
2022/02/28 HTML / CSS