我一直试图找到近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..
在2002年(!)中报告了JDK管理gzip文件的方式a bug。似乎Java仍然有这个错误,唯一的解决方法是告诉HttpUnit不接受gzip编码数据,如下所示:
WebConversation.getClientProperties().setAcceptGzip(false);
不幸的是,我不能这样做。为了使登录成功,我需要启用gzip,否则我只是被重定向到通用主页(没有登录)。
我怀疑使这项工作的唯一方法是更改HttpUnit的源代码并在其gzip解析中处理EOF excpetion。我迫切需要帮助。有人有解决方案吗?
如果没有,那么您可以在Java中建议一些等效的简单API,例如HttpUnit,用于填写表单和登录等任务。
答案 0 :(得分:1)
我怀疑做这项工作的唯一方法就是改变来源 HttpUnit的代码并在它的gzip解析中处理EOF excpetion。
当第三方库中存在错误时,这通常是开发人员的解决方案。如果您知道HttpUnit中的问题,为什么不在本地修复它?您甚至可以将修复程序推回到项目中,并希望他们采用它。
如果没有,那么你可以在Java中建议一些等效的简单API,例如HttpUnit,用于填写表格和登录等任务。
如果你指的是一个遍历网站的图书馆,那就有很多。如果您想要“无头”HTTP客户端,请尝试Apache HttpComponents HttpClient。如果您想要实际使用浏览器的内容,请尝试Selenium。
答案 1 :(得分:0)
看来这个问题在HttpUnit 1.7(我使用的是1.6)中得到了解决 无论如何,我正在转移到@ShaggyFrog建议的HttpComponents,因为现在我遇到了更大,未知的cookie和会话问题。
编辑:似乎HttpComponents过于复杂。有一次,我不得不手动处理Http 302重定向。所以我决定转移到HtmlUnit,它与HttpUnit非常相似,但没有任何cookie或gzip问题。工作就像一个魅力。