HttpClient不会返回已完成的html源代码

时间:2010-12-10 04:05:44

标签: java http response httpclient

我需要登录一个网站,点击几个链接到最终屏幕下载一些数据,这里是步骤:

  • 第一步:登录第一页的网站;
  • 第二步:点击第一页上的“查看”链接进入第二页;
  • step3:在第二页上,输入'帐号',点击提交按钮,显示多行数据,我称之为第三页) (我通过将此URL粘贴到浏览器上的地址栏,获得第三页的直接URL,第三页正确显示)

这是我的问题: 我正在使用Httpclient。它通过了登录页面,它可以到达第三页,但它只是 返回页面上的静态部分,不返回基于输入'帐号'的部分动态生成的数据。

以下是代码:

HttpClient client = new HttpClient();
client.getHostConfiguration().setHost(loginUrl);

PostMethod postMethod = new PostMethod(serverUrl);
 // Prepare login parameters
NameValuePair[] data = {
    new NameValuePair("passUID",account),
    new NameValuePair("passUCD",password)
};

postMethod.setRequestBody(data);
// I can print out the html code of the login page here

//request the third page with URL: serverUrl4
postMethod = new PostMethod(serverUrl4);
   NameValuePair[] data2 = {
               new NameValuePair("passUID",account),
               new NameValuePair("passUCD",""),
               new NameValuePair("page", "view"),
               new NameValuePair("procacct", "0"),
               new NameValuePair("AcctNo", "xxxxxxxxx")
   };

postMethod.setRequestBody(data2);
client.executeMethod(postMethod);
byte[] responseBody = postMethod.getResponseBody();

如果我将URL与上面的namevaluepairs粘贴到浏览器的URL中,则会正确显示帐户数据。但响应主体不会返回动态生成的帐户数据,还会返回其他任何内容,但会显示“帐户数据”部分。

有人知道为什么吗?任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:2)

相关网页是否使用JavaScript生成此数据?如果是这样,HTTPClient就不足以获得你想要的东西。

答案 1 :(得分:0)

通常在POST后会有来自服务器的redirect请求(HTTP / 1.1 302),检查服务器响应的状态代码。此外,您应该提供服务器用来识别登录用户的cookies

修改

希望此代码段有帮助:

if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||  statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
    Header locationHeader = postMethod.getResponseHeader("location");
    if (locationHeader != null) {
        String location = locationHeader.getValue();
        System.out.println("The page was redirected to:" + location);
        /* **strong text**
        here is code to handle redirect to 
        "location" got from response headers
        */
    } else {
            System.err.println("Location field value is null.");
    }
}