有啥方法可以自定义 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 响应状态?的主要内容,如果未能解决你的问题,请参考以下文章
java可以自定义设置请求响应的状态码码?应该可以的,淘宝都这样做了