0

我一直在尝试寻找解决方法近 6 个小时,但无济于事。
我有一个简单的 HttpUnit 程序,可以登录网站。问题是当我最终提交登录表单时出现此错误:

Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
   at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:223)
   at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:141)
   at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:92)
   at com.meterware.httpunit.WebResponse.readFromStream(WebResponse.java:967)
                         ..and so on..  

似乎JDK 管理 gzip 文件的方式存在错误,早在 2002 年就有报告(!)。看来 Java 仍然有这个错误,唯一的解决方法是告诉 HttpUnit 不接受 gzip 编码的数据,如下所示:

WebConversation.getClientProperties().setAcceptGzip(false);

不幸的是,这是我做不到的。为了使登录成功,我需要启用 gzip,否则我只会被重定向到通用主页(没有登录)。
我怀疑完成这项工作的唯一方法是更改​​ HttpUnit 的源代码并在其 gzip 解析中处理 EOF 异常。我迫切需要帮助。有人对此有解决方案吗?

如果没有,那么您能否建议一些在 Java 中相当简单的 API,例如 HttpUnit,用于填写表单和登录等任务。

4

2 回答 2

1

我怀疑完成这项工作的唯一方法是更改​​ HttpUnit 的源代码并在其 gzip 解析中处理 EOF 异常。

当第三方库中存在错误时,这通常是开发人员的解决方案。如果您知道 HttpUnit 的问题所在,为什么不在本地修复它呢?您甚至可以将修复推送回项目并希望他们采用它。

如果没有,那么您能否建议一些在 Java 中相当简单的 API,例如 HttpUnit,用于填写表单和登录等任务。

如果您的意思是一个遍历网站的库,那么有很多。如果您想要一个“无头”HTTP 客户端,请尝试使用Apache HttpComponents HttpClient。如果您想要实际使用浏览器的东西,请尝试Selenium

于 2012-05-29T19:50:17.647 回答
0

看来这个问题在 HttpUnit 1.7 中已修复(我使用的是 1.6)。
无论如何,我正在按照@ShaggyFrog 的建议转向 HttpComponents,因为现在我遇到了更大的、未知的 cookie 和会话问题。

编辑:似乎 HttpComponents 过于复杂。在某一时刻,我不得不手动处理 Http 302 重定向。所以我决定转向 HtmlUnit,它与 HttpUnit 极其相似,但没有任何 cookie 或 gzip 问题。像魅力一样工作。

于 2012-05-29T20:52:07.060 回答