如何解决Tomcat 收到 HTTP 400,但 CURL 收到 200
我有一个非常奇怪的场景,在 Linux 服务器中,CURL 成功地检索了来自 Web 服务的响应。当 Tomcat 在用于 CURL 命令的同一 Linux 服务器上发出相同的请求时,由于某种原因,Tomcat 会收到 400 状态代码,这会阻止我执行我们的业务逻辑。
CURL 流:
使用 Tomcat 的流程:
是什么导致了这个问题? 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 主体?如果是,请检查该模型类是如何序列化的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。