2010-12-10 64 views
2

我需要登录一个网站,点击一些链接到最后的画面下载一些数据,这里是步骤:HttpClient的不填妥的HTML源代码

  • 第一步:登录到第一页上的网站;
  • 第二步:点击第一页上的'查看'链接进入第二页;
  • 步骤3:在第二页上输入'账号',点击提交按钮即可获取显示的多行数据,我称之为第三页) (我通过粘贴获得第三页的直接粘贴,这个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(); 

如果我贴在网址到浏览器上面namevaluepairs中的URL,显示正确的帐户数据。但响应者不会返回动态生成的帐户数据,其他任何内容都会返回,但“帐户数据”部分。

有人知道为什么吗?任何帮助,高度赞赏。

回答

2

问题页面是否使用JavaScript来生成此数据?如果是这样,HTTPClient不足以得到你想要的。

+0

感谢安德鲁!它是javascript生成的数据。你能提出建议来解决这个问题吗? – swei 2010-12-13 21:34:02

+0

不知道更多关于目标页面。如果它只是对Web服务进行ajax调用,那么你可能会模拟它,但如果它正在进行计算,那么你可能会运气不好。 – 2010-12-13 22:14:16

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."); 
    } 
}