• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    解决Golang中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. 下面是报错截图

    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设置http response响应头与填坑记录
    • 解决golang处理http response碰到的问题和需要注意的点
    • golang中为什么Response.Body需要被关闭详解
    上一篇:golang在GRPC中设置client的超时时间
    下一篇:go 原生http web 服务跨域restful api的写法介绍
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    解决Golang中ResponseWriter的一个坑 解决,Golang,中,ResponseWriter,