我正在用Java编写一个API,由Tomcat提供。
我注意到,当发出无效请求时,例如
http://api.demo.com/endpoint?param=hel\lo
Tomcat将抛出以下异常
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
并以空体发回400错误。我完全理解为什么会这样做,它有很好的记录,并且完全有道理。我孤立地对这种行为没有任何问题。
我遇到的问题是,我们的API网关的当前版本是用PHP编写的(使用NGINX)并且它的行为不是这样的。请求被接受,请求参数被url编码(修复原始请求),并被传递到下一个服务器。
我可以看到我可以使用Tomcat配置允许|{}
字符通过,但我还需要让其他非法字符通过。
我不想再使用PHP了 - 我想要一个纯Java解决方案,但我真的可以复制API现有的行为(我知道这几乎肯定是错误的)。快速浏览一下其他几个随机API - Google,Facebook,Twitter和Spotify - 表明Spotify将返回400,所有其他API将接受请求并返回响应。
我知道我可以降级Tomcat,修补我现有的(最新)Tomcat版本,或者重新引入PHP。我宁愿不做任何这些。有没有人知道我怎么能够克服这个问题,某种NGINX反向代理哪个URL编码转发到Tomcat之前呢?
即使我可以在身体中放置一个响应,但它总比没有好 - 我们的消费者会期待JSON(即使出现错误),并且至少其中一些可能会尝试和JSON解析响应没有先检查它 - 我担心这可能会导致问题,如果它导致解析器尝试解析空字符串失败。