【问题标题】:405 Method is not Allowed exception: "Request Method 'T' not supported" for GET call and "Request Method 'ST' not supported" for POST405 Method is not Allowed 例外:GET 调用的“请求方法 'T' 不支持”和 POST 的“请求方法 'ST' 不支持”
【发布时间】:2020-08-22 07:10:39
【问题描述】:
我在我的项目中遇到了一个非常奇怪的问题。它与使用spring响应式webclient bulider的rest API调用有关。它在本地和产品上也可以正常工作,但在向同一端点发出 3 或 4 次请求后异常给出以下错误。
“org.springframework.web.server.MethodNotAllowedException:405 METHOD_NOT_ALLOWED“不支持请求方法'T'”
这是有效的例外,因为方法将“T”用于 Get 方法,“ST”用于 Post 方法。我无法理解为什么两个起始字符从方法名称中截断
请帮我解决这个错误。
【问题讨论】:
标签:
spring
spring-boot
spring-webclient
【解决方案1】:
OP 和我一定是唯一经历过这种情况的人,老实说,我不知道根本原因,但这是我的情况和解决方法。
对我来说,我在 docker 中运行了 2 个服务。一项服务会向另一项服务发出请求。第一个请求总是成功,但随后的请求总是失败。一段时间后,新的请求再次成功。
我推测它一定与持久连接有关。我正在使用 OkHttpClient 库(3.14.9)发出请求。接收请求的服务正在运行 spring webflux,但我认为该服务不是问题。我可以从第一个服务的容器内使用 curl 向它发出重复成功的请求。
OkHttpClient 默认使用保持连接。您可以通过将Connection 标头设置为close 来指定您不想保持连接活动的单个请求。一旦我这样做了,所有请求都会再次起作用。
无论出于何种原因,keep-alive 连接的重用并没有发送整个请求。它总是截断方法的前 2 个字符,这就是 Request method 'T' not supported 的原因。也许第一个请求没有正确结束并吃掉了第二个请求的前 2 个字符。我不知道根本原因。可能是 OkHttpClient 的一个错误