使用HttpClient Post登录网站

3
我正在尝试制作一个程序,用于登录网站并执行一些自动化活动。我一直在使用HttpClient 4.0.1,并使用以下内容开始:http://hc.apache.org/httpcomponents-client/primer.html
在这个特定的网站上,cookie不是通过“set-cookie”头设置的,而是通过JavaScript设置的。
到目前为止,我无法实现登录。
我尝试了以下几件事:
1.手动添加所有在firebug中显示的请求头的标头
NameValuePair[] data = { new BasicNameValuePair("Host",host), new BasicNameValuePair("User-Agent"," Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"), new BasicNameValuePair("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"), new BasicNameValuePair("Accept-Language","en-us,en;q=0.5"), new BasicNameValuePair("Accept-Encoding","gzip,deflate"), new BasicNameValuePair("Accept-Charset","ISO-8859-1,utf-8;q=0.7,*;q=0.7"), new BasicNameValuePair("Keep-Alive","300"), new BasicNameValuePair("Connection","keep-alive"), new BasicNameValuePair("Referer",referer), new BasicNameValuePair("Cookie",cookiestr) };
for(NameValuePair pair : data){ loginPost.addHeader(pair.getName(),pair.getValue()); }
2.创建BasicClientCookies并使用setCookieStore设置。不幸的是,我无法弄清楚cookie是否实际被发送。此外,有没有办法测试发送了哪些其他自动参数?(例如模拟了哪个浏览器等)。
我得到的响应是:HTTP/1.1 417 Expectation Failed。
我对这个还很新,所以有人知道问题可能是什么吗?如果没有,我将发布更多详细信息、代码和网站。

这里有一段代码片段展示了如何使用httpclient 4中带参数的post方法 - adiian
3个回答

1

你需要 WireShark 或者 Fiddler。第一个是网络分析器(所以你可以看到非常底层的情况);第二个则充当代理 - 透明度较低,但层次更高。

这样你就可以详细查看使用浏览器登录时发生了什么,以及在代码中尝试执行相同操作时发生了什么。


1

我想重申上面的评论-使用Wireshark清楚地查看从客户端发送的内容。我刚刚用Wireshark调试了一个类似的问题。非常必要。

如果您还没有这样做,建议您学习http://hc.apache.org/httpcomponents-client/examples.html中的示例,特别是“基于表单的登录”。

我建议避免使用BasicNameValuePair设置Http头,HttpClient应该为您提供基础知识。使用HttpParams和HttpConnectionParams / HttpProtocolParams进行进一步修改。示例conn / ManagerConnectDirect展示了如何修改标题。


0
你可以使用FireBug的“net”功能来查看在浏览器中登录时发生了什么。这样,你应该能够找出哪种方法生成了cookie值,以及它应该如何设置(路径、名称)。使用此方法自己在HttpClient上设置cookie,例如:
method.setRequestHeader("Cookie", "special-cookie=value");

我已经在做那个了,但并非所有的 cookies 都是这样设置的。此外,我认为 setRequestHeader 是针对旧版本 httpclient 的。 - humoeba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接