我正在尝试使用Apache HttpComponents Client在Java中模拟网站上的登录过程。它现在失败了,我不知道为什么。我在Firefox中使用Firebug来尝试理解等效的浏览器事件,我确信它是通过表单上的特定POST方法登录的。
这是我的代码。最后我希望设置一大堆cookie,但它们不是,并且我得到的后续GET请求的响应证明登录失败。
String email = ...
String password = ...
String url = ...
DefaultHttpClient client = new DefaultHttpClient();
List<NameValuePair> loginParams = new ArrayList<NameValuePair>(2);
loginParams.add(new BasicNameValuePair("logindetails[email]", email));
loginParams.add(new BasicNameValuePair("logindetails[password]", password));
UrlEncodedFormEntity loginEntity = new UrlEncodedFormEntity(loginParams);
HttpPost loginPost = new HttpPost(url);
loginPost.setEntity(loginEntity);
HttpResponse loginResponse = client.execute(loginPost);
HttpEntity loginRepsonseEntity = loginResponse.getEntity();
loginRepsonseEntity.consumeContent();
for (Cookie cookie: client.getCookieStore().getCookies()) {
System.out.println(cookie.getName() + " -> " + cookie.getValue());
}
我应该从哪里开始寻找问题?我想验证POST与我的浏览器的POST是一样的 - 最好的方法是什么?
答案 0 :(得分:2)
我们每天在工作的地方使用Apache HttpClient,这太棒了。你在做什么,你自己编码数据,对我来说看起来有点奇怪。有一种更简单的方法。我假设你正在做一个帖子。
String email = ...
String password = ...
String url = ...
PostMethod post = new PostMethod(url);
NameValuePair[] data = {
new NameValuePair("logindetails[email]", email),
new NameValuePair("logindetails[password]", password)
};
post.setRequestBody(data);
// execute method and handle any error responses.
HttpClient httpclient = new HttpClient();
int statusCode = httpclient.executeMethod(post);
// continue as neccessary
我从Apache HttpClient站点获取了该代码(并对其进行了修改以使其更适合您)。除非你有充分的理由,否则你不需要使用UrlEncodedFormEntity自行打包字段。
至于调试这种东西,最简单的方法是使用WireShark来观察数据包的来回。其中任何一个都可以让你来回查看请求(只要你不使用HTTPS),这样你就可以通过将它与浏览器发送的内容进行比较,轻松地告诉错误发送的内容。它不是世界上用户最友好的程序,但在试图弄清楚这种东西时它是非常宝贵的。
答案 1 :(得分:1)
您可以在Firefox中使用Firebug查看网络标签,以调查在您使用网页时如何完成帖子。看看你的代码,我的猜测是你的参数名称很奇怪。 logindetails[email]
和logindetails[password]
看起来很奇怪。
这相当于:
<form action="...url" method="post">
email: <input type="text" name="logindetails[email]"/><br/>
password: <input type="password" name="logindetails[password]"/><br/>
<input type="submit" value="submit"/>
</form>
确保这是你想要的......
答案 2 :(得分:0)
看看精彩的cURL实用程序 - &gt; http://curl.haxx.se/docs/manpage.html
它在Unix / Linux中无处不在,可以在Windows下的Cygwin下使用。
它允许您通过命令行中的几次击键实现您在Java中尝试执行的操作。