解决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判断key是否在map中的代码
Apr 24 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
深入理解go slice结构
Sep 15 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang并发工具Singleflight
May 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
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
详解jQuery Mobile自定义标签
2016/01/06 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
详解Vue快速零配置的打包工具——parcel
2018/01/16 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
vue 移动端适配方案详解
2018/11/15 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
Python的装饰器用法学习笔记
2016/06/24 Python
使用Python处理BAM的方法
2018/09/28 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
初中生自我评价
2014/02/01 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
个人年终总结范文
2015/03/09 职场文书
寒假致家长的一封信
2015/10/10 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
pytorch 如何使用batch训练lstm网络
2021/05/28 Python