有啥方法可以自定义 HTTP 响应状态?

Posted

技术标签:

【中文标题】有啥方法可以自定义 HTTP 响应状态?【英文标题】:Is there any way that I could customize HTTP response status?有什么方法可以自定义 HTTP 响应状态? 【发布时间】:2019-11-01 16:17:18 【问题描述】:

我需要在我的 Web 服务器的处理程序中自定义 HTTP 状态,但我发现 golang 似乎不支持完全自定义 HTTP 响应.. 例如:

w.WriteHeader(999)

这是curl 结果:

$ curl -vk -i localhost:9898/hello

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 9898 (#0)
> GET /hello HTTP/1.1
> Host: localhost:9898
> User-Agent: curl/7.54.0
> Accept: */*
> 
< HTTP/1.1 999 status code 999
HTTP/1.1 999 status code 999
< Date: Wed, 19 Jun 2019 02:01:09 GMT
Date: Wed, 19 Jun 2019 02:01:09 GMT
< Content-Length: 0
Content-Length: 0

结果中的status code 似乎无法修改.. 但是,我想定义自己的状态,例如Bad Request: xxx

有什么好主意吗?非常感谢!

【问题讨论】:

请记住,机器不打算使用状态文本,只使用数字代码。文本是为人类设计的。试图对文本做某事的程序违反了 RFC。 @MichaelHampton 我认为您不了解我真正需要和想要的内容。当然,状态文本是针对人类的。但是总有一些奇怪的要求,不是吗?无论如何,谢谢你的提醒。 【参考方案1】:

此功能在net/http/server.go 中处理:

func writeStatusLine(bw *bufio.Writer, is11 bool, code int, scratch []byte) 
    if is11 
        bw.WriteString("HTTP/1.1 ")
     else 
        bw.WriteString("HTTP/1.0 ")
    
    if text, ok := statusText[code]; ok 
        bw.Write(strconv.AppendInt(scratch[:0], int64(code), 10))
        bw.WriteByte(' ')
        bw.WriteString(text)
        bw.WriteString("\r\n")
     else 
        // don't worry about performance
        fmt.Fprintf(bw, "%03d status code %d\r\n", code, code)
    

从中可以看出,描述性文本来自标准库的内部状态码列表,同样由StatusText函数公开。

如果没有已知文本,则使用占位符“状态代码”,没有更改此行为的选项。

所以使用标准库http 包,没有办法做你想做的事。您的选择是在自己的包中分叉和/或重新实现此功能,或者(可能是长期的)向上游提交功能请求以更改此功能。

如果出于某种原因确实需要此功能,那么最后一种绝望的方法可能是编写某种代理,它拦截 HTTP 输出,并为您转换“状态代码”文本。您可以通过编写自己的net.Listener 实现/包装器来完成此操作,然后将其传递给http.Serve。这不会很有效,并且非常不鼓励,除非您绝对别无选择。

【讨论】:

非常感谢。你的回答给了我很多启发!【参考方案2】:

我认为目前不支持您尝试的内容。

根据the official documentation of net/http.ResponseWriter.WriteHeader

提供的代码必须是有效的 HTTP 1xx-5xx 状态代码。只能写入一个标题。 Go 目前不支持发送用户自定义的 1xx 信息头,除了服务器在读取 Request.Body 时自动发送的 100-continue 响应头。

【讨论】:

这并没有真正解决问题。您已经讨论了可接受的状态代码值,但没有讨论它们的描述性文本。

以上是关于有啥方法可以自定义 HTTP 响应状态?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 自定义 http 错误响应?

java可以自定义设置请求响应的状态码码?应该可以的,淘宝都这样做了

如何使用 mod_perl 发送自定义 http 状态码

Spring Boot 异常自定义处理 - 意外的 HTTP 状态

Python调用自定义模块方法有啥

有啥方法可以导入带有自定义指令的查询吗?