到目前为止,我已经为HttpURLConnection和setRequestProperty工作了2天,我无法将此网页发布到Post并返回我想要的页面。这就是我到目前为止......
... 字符串数据= URLEncoder.encode(“acctno”,“UTF-8”)+“=”+ URLEncoder.encode(“1991462”,“UTF-8”);
URL oracle = new URL("http://taxinquiry.princegeorgescountymd.gov");
HttpURLConnection yc = (HttpURLConnection) oracle.openConnection();
yc.setRequestMethod("POST");
yc.setRequestProperty("Content-Type", "text/html; charset=utf-8");
yc.setRequestProperty("Content-Length", "19004");
yc.setRequestProperty("Cache-Control", "private");
yc.setRequestProperty("Set-Cookie", "ASP.NET_SessionId=v5rdm145zv3jm545kdslgz55; path=/");
yc.setRequestProperty("X-AspNet-Version", "1.1.4322");
yc.setRequestProperty("X-Powered-By", "ASP.NET");
yc.setRequestProperty("Server", "Microsoft-IIS/6.0");
yc.setDoOutput(true);
yc.setDoInput(true);
OutputStreamWriter out = new OutputStreamWriter(yc.getOutputStream());
out.write(data);
out.flush();
//out.write(data);
out.close();
...
它返回URL中定义的相同页面。它不会向我发送应该有一个结尾/taxsummary.aspx
的请求页面看起来好像asp获取post数据并为给定的每个参数生成唯一的HTML。我如何给它正确的参数?
答案 0 :(得分:2)
您的代码看起来很好。我相信它正确发送POST。我认为问题不在这里。当您使用浏览器时,首先执行至少一个HTTP GET以到达表单。执行此操作时,服务器会为您创建HTTP会话,并在响应标头Set-Cookie中返回其ID。当您使用浏览器提交表单时,它会返回此标题(Cookie),以便服务器可以识别会话。
当您使用java工作时,您正在跳过第一阶段(HTTP GET)。所以你要做的第一件事是POST,而你还没有会话。我不知道这个ASP页面的逻辑是什么,但我认为它只是拒绝这样的请求。
所以,首先检查这个猜测。您可以使用名为LiveHttpHeaders的Firefox插件。安装它并手动执行操作。您将看到所有HTTP请求和响应。保存他们。检查会话ID是否从服务器发送回客户端。现在在java中实现完全相同。
顺便说一句,当服务器发送多个重定向响应时,情况通常更复杂。在这种情况下,你必须遵循它们。 HttpConnection有方法setFollowRedirects()。用参数true调用它。
BTW2:Apache HttpClient是HttpConnection的完美替代品。它可以完成所有工作,在您实施此类任务时非常值得推荐。
这就是全部。祝好运。有时候这并不容易......