Tomcat 收到 HTTP 400,但 CURL 收到 200

问题描述

我有一个非常奇怪的场景,在 Linux 服务器中,CURL 成功地检索了来自 Web 服务的响应。当 Tomcat 在用于 CURL 命令的同一 Linux 服务器上发出相同的请求时,由于某种原因,Tomcat 会收到 400 状态代码,这会阻止我执行我们的业务逻辑。

CURL 流:

  • CURL 使用代理 A 向服务 A 发出请求
  • 服务 A 检索我们需要的数据并返回它,以及一个 200 状态代码
  • CURL 收到正确的数据和 200 状态代码...

使用 Tomcat 的流程:

  • Tomcat 使用代理 A 向服务 A 发出请求
  • 服务 A 检索我们需要的数据并返回它,以及一个 200 状态代码
  • Tomcat 收到 400 状态代码并且无法接收正确的数据...

是什么导致了这个问题? Tomcat 和 CURL 使用相同的代理并且在同一个 linux 服务器中......即使服务能够成功获取数据并将其返回给两者。只有在tomcat的情况下,服务在尝试将数据写入响应后才会抛出此错误

2021-03-10 21:49:36.908  WARN 90623 --- [https-jsse-nio-8123-exec-10] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is org.apache.catalina.connector.ClientAbortException: java.net.socketTimeoutException]

Tomcat 关闭套接字,因为它看到 400 响应代码,并且在我执行 con.getInputStream() 时甚至不尝试从响应中读取字节。我真的不知道 400 状态代码来自哪里。

感谢任何帮助。谢谢。

2021/03/11 更新:

我忘记提及的一件事是,Tomcat 能够对同一服务执行其他请求。这里的主要区别是响应的大小。与我们得到的其他较小响应相比,尝试读取这个大响应时会超时。

2021/03/16 更新:

在深入调查正在发生的事情后,我发现,每当我用 Java 发出请求时,由于某种原因,它会在 2 分钟时超时。这不会发生在 CURL 上,只会发生在 Java 上。有什么我可能会遗漏的吗?我已经将这些添加到我的代码中:

JVM 参数:

-Dsun.net.client.defaultReadTimeout=6000000 -Dsun.net.client.defaultConnectTimeout=6000000

Java 代码

con.setReadTimeout(Integer.MAX_VALUE);
con.setConnectTimeout(Integer.MAX_VALUE);
con.setDoOutput(true);
con.setDoInput(true);

我使用的是 HttpURLConnection 对象。

解决方法

dt=read.table(text=text,header=TRUE)
library(dplyr)
dt %>% group_by(ID) %>% mutate(HRS_Sem1Attempted=n()*3)
dt

     ID TermCode CourseCode Grade GradePoints UGCohort Gender X.Race.Ethnicity. HRS_Sem1Attempted
  <int>    <int>      <int> <fct>       <dbl>    <int> <fct>  <fct>                         <dbl>
1   189   202009        284 W            0        2020 M      White                             9
2   189   202009        235 W            0        2020 M      White                             9
3   189   202009        304 W            0        2020 M      White                             9
4   323   202009          4 B+           3.33     2020 M      Other/Unknown                    12
5   323   202009        235 B+          20        2020 M      Other/Unknown                    12
6   323   202009        159 A           12        2020 M      Other/Unknown                    12
7   323   202009        106 A            8        2020 M      Other/Unknown                    12

无法读取您的tomcat发送给服务的消息。你的 tomcat 发送到服务的消息发生了一些事情。它是否包含 json 主体?如果是,请检查该模型类是如何序列化的。