欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解决Golang中ResponseWriter的一个坑

程序员文章站 2022-04-03 20:40:16
在使用context.responsewriter中的set/writeheader/write这三个方法时,使用顺序必须如下所示,否则会出现某一设置不生效的情况。ctx.responsewriter...

在使用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
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。