如何针对解析错误自定义Golang http 400响应?

我编写了一个REST API服务,要求所有响应都是
JSON.但是,当Go http请求解析器遇到错误时,它会返回400作为纯文本响应,而不会调用我的处理程序.例:

> curl -i -H 'Authorization: Basic hi    
there' 'http://localhost:8080/test' -v
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /test HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.54.0
> Accept: */*
> Authorization: Basic hi
> there
> 
< HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
< Content-Type: text/plain; charset=utf-8
Content-Type: text/plain; charset=utf-8
< Connection: close
Connection: close

< 
* Closing connection 0

请注意无效的Authorization标头.当然,400是正确的回应,但当然是文本/简单.有没有办法配置Go http解析器使用自定义错误响应媒体类型和主体?

最佳答案 你不能.您可以在net / http源中找到它,只有在请求格式错误时才会发生:

https://github.com/golang/go/blob/master/src/net/http/server.go#L1744

我认为您的问题可能是您在curl中添加的标题中的新行?

您将能够使用json响应401,403,404,500错误,但在server.go中处理错误请求或错误标题(太长,格式不正确).

目前没有办法拦截这些错误虽然它是在consideration之下,所以你唯一的解决方案是修补stdlib源(我不推荐这个).但是,由于此错误仅在客户端出错并且请求格式错误时才出现,因此可能不是一个大问题.文本响应的原因是浏览器或类似客户端(如没有-v的curl)不会只看到空响应.你可以在你的应用程序前放置像nginx这样的代理,但是你永远不会看到请求,因为它是一个错误的请求,你的代理会处理它.

可能你可以在前面使用像nginx这样的代理,但是如果你设置一个特定的静态错误页面来为400个错误服务并提供你指定的400.json文件?这是我能想到的唯一解决方案.像这样的指令可能适用于nginx:

error_page 400 /400.json;

如果您希望能够自定义这些错误,可能会对链接的问题添加注释,让他们知道您遇到了这个特定问题.

点赞