当前位置: 首页 > 面试题库 >

如何为解析错误自定义HTTP 400响应?

解博明
2023-03-14
问题内容

我已经编写了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

请注意无效的授权标头。当然,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中处理。

尽管正在考虑中,但目前尚无办法拦截此类错误,因此您唯一的解决方案是修补stdlib源代码(我不建议这样做)。但是,由于此错误仅在客户端犯了一个错误并且请求格式错误时才会出现,因此这可能不是一个大问题。文本响应的原因是,浏览器或类似客户端(例如不带-
v的curl)不会仅看到空响应。您可以在应用程序前面放置一个像nginx这样的代理,但是由于它是一个不好的请求,所以您永远也看不到该请求,您的代理会处理它。

也许您可以使用像nginx这样的代理服务器来实现,尽管如果您为其设置了一个特定的静态错误页面来处理400个错误并提供了您指定的400.json文件呢?这是我能想到的唯一解决方案。像这样的指令可能适用于Nginx:

error_page 400 /400.json;

如果您希望能够自定义这些错误,则可以在链接的问题上添加注释,以使他们知道您遇到了此特定问题。



 类似资料:
  • 给Rest服务打电话 http://acme.com/app/widget/123 返回: 此客户端代码的工作原理是: 但是,http://acme.com/app/widget/456返回: 但此客户端代码引发了一个异常: 我试过: 第二次调用只是抛出了另一个HttpClientErrorException,而且它觉得调用服务两次是不对的。 是否有一种方法可以调用该服务一次,并在成功时将响应解析

  • Apache可以让网站管理员自己自定义对一些错误和问题的响应。 自定义的响应可以定义为当服务器检测到错误或问题时才被激活。 如果一个脚本崩溃并产生"500 Server Error"响应,那么这个响应可以被更友好的提示替换或者干脆用重定向语句跳到其他的URL(本地的或外部的)。 行为 老式的行为 Apache1.3 会响应一些对于用户没有任何意义的错误或问题信息,而且不会将产生这些错误的原因写入日

  • 请帮助我了解我应该在哪里更新失败案例的实际合同?

  • 然而,这产生了(正如怀疑的那样)完全不同的反应:

  • 我正在努力裁剪javax。验证。ConstraintValidator和javax。验证。根据我的需要限制ValidatorContext。我从格式错误的请求正文收到的响应消息始终采用以下形状: <代码> 此消息也以500而不是400错误请求的形式返回。我无法获得工作到解决方案来执行以下操作: 仅包括<代码> 我有以下代码: 向上面的代码发送格式错误的有效负载将导致如下消息: 我希望能够收到以下信