解决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 Int转string几种方式性能测试
Apr 28 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
Golang全局变量加锁的问题解决
May 08 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
Go语言基础知识点介绍
Jul 04 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang并发工具Singleflight
May 06 Golang
基于Python实现西西成语接龙小助手
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使用glob函数快速查询指定目录文件的方法
2014/11/15 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
微信小程序request请求后台接口php的实例详解
2017/09/20 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
2018/03/13 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
用python与文件进行交互的方法
2018/03/01 Python
python面试题小结附答案实例代码
2019/04/11 Python
Python实现快速排序的方法详解
2019/10/25 Python
django框架中间件原理与用法详解
2019/12/10 Python
Django values()和value_list()的使用
2020/03/31 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
NEW LOOK官网:英国时装零售巨头之一,快时尚品牌
2017/01/11 全球购物
Move Free官方海外旗舰店:美国骨关节健康专业品牌
2017/12/06 全球购物
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
英国女装网上商店:I Saw It First
2018/10/18 全球购物
英国DIY汽车维修配件网站:DIY Car Service Parts
2019/08/30 全球购物
分公司负责人任命书
2014/06/04 职场文书
农业项目建议书
2014/08/25 职场文书
中队活动总结
2014/08/27 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
2014年工程部工作总结
2014/11/25 职场文书
长城导游词
2015/01/30 职场文书
保外就医申请书范文
2015/08/06 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书