如何针对解析错误自定义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; 如果您希望能够自定义这些错误,可能会对链接的问题添加注释,让他们知道您遇到了这个特定问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |