解决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语言操作数据库及其常规操作的示例代码
Apr 21 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
goland设置颜色和字体的操作
May 05 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Golang二维数组的使用方式
May 28 Golang
入门学习Go的基本语法
Jul 07 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Go 内联优化让程序员爱不释手
Jun 21 Golang
Go gorilla securecookie库的安装使用详解
Aug 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
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
React应用中使用Bootstrap的方法
2017/08/15 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
详解vue 组件的实现原理
2020/11/12 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
详解Vue的异步更新实现原理
2020/12/22 Vue.js
python下载文件记录黑名单的实现代码
2017/10/24 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Python箱型图处理离群点的例子
2019/12/09 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
Python requests模块session代码实例
2020/04/14 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
使用 HTML5 Canvas 制作水波纹效果点击图片就会触发
2014/09/15 HTML / CSS
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
司机的工作范围及职责
2013/11/13 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书