解决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 25 Golang
go设置多个GOPATH的方式
May 05 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
golang 语言中错误处理机制
Aug 30 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
golang为什么要统一错误处理
Apr 03 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
golang的文件创建及读写操作
Apr 14 Golang
Golang jwt身份认证
Apr 20 Golang
Golang 切片(Slice)实现增删改查
Apr 22 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 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
桌面中心(二)数据库写入
2006/10/09 PHP
PHP中ADODB类详解
2008/03/25 PHP
PHP数组及条件,循环语句学习
2012/11/11 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
js中有关IE版本检测
2012/01/04 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
Python FTP操作类代码分享
2014/05/13 Python
浅谈Python单向链表的实现
2015/12/24 Python
python添加模块搜索路径方法
2017/09/11 Python
Django的分页器实例(paginator)
2017/12/01 Python
pycharm debug功能实现跳到循环末尾的方法
2018/11/29 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
酒店仓管员岗位职责
2014/04/28 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
党员教师群众路线对照检查材料思想汇报
2014/09/29 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP