首页 > 解决方案 > Apache Http 客户端是否在没有消息的情况下处理状态代码?(Curl 有效,但 Http 客户端失败)

问题描述

我有一个使用 Apache Http Client 向第三方发出请求的 servlet。这已经工作了多年,但我正在添加一个新的第三方,我通过现有的 servlet 调用它。它在 servlet 中失败(404),但curl在同一台机器上使用命令行可以正常工作。

真正奇怪的是它对第三方的沙盒系统起作用,无论是来自 curl 还是来自 servlet。我在两种情况下的 curl 输出中看到的唯一区别是100 Continue如何从第三方服务器返回。当我调用沙箱服务器(也可以从 Http 客户端工作)时,返回的标头如下所示:

< HTTP/1.1 100 Continue
< HTTP/1.1 200

当我调用测试/QA 系统(从 curl 但不能从 Http 客户端工作)时,等效行是

< HTTP/1.1 100
< HTTP/1.1 200

如您所见,有效的返回100 Continue,而无效的则返回100。据我了解,建议将消息​​作为状态的一部分包含在内,但这是可选的,因此这是符合标准的。而且我没有遇到异常,我得到了一个带有 HTML 正文的 404 页面,该页面显然来自该第三方。

我已经尝试激活“有线”日志记录(根据他们的文档- 我们正在使用 log4j,因此将其添加到现有的属性文件中),但根本没有得到任何额外的日志记录。这就是为什么我使用 curl 来尝试查看第三方反应的不同之处。

我尝试禁用整个 100-continue(.setExpectContinueEnabled(false)在构建 my 时RequestConfig)但没有帮助(curl 也可以在没有 100-continue 的情况下工作)

100如果不包含消息,Apache Http 客户端是否会以某种奇怪的方式失败?还是我专注于完全错误的地方?

(我们仍在使用 Apache Http Client 的 4.5.x 分支 - 我升级到最新的 4.5.13。我可以尝试 5.xx 系列,但我猜这会影响更多)

标签: javahttpcurlapache-httpclient-4.xapache-httpcomponents

解决方案


事实证明,客户端确实可以100很好地处理没有消息的情况。

https://api.example.com/foo问题是适用于但给了 404的第三部分https://api.example.com:443/foo!不要问...

curl命令包括端口,但 curl 必须将其剥离,因为它是标准端口。改变我的servlet来做到这一点,它工作。


推荐阅读