我几乎一字一句地复制了 Mkyong的Apache HttpClient 示例,除了交换弃用的方法和我自己的登录信息(我甚至设法复制他的错别字!):Mkyong's example
private void sendPost(String url, List<NameValuePair> postParams)
throws Exception {
post.setParams(params);
post.setHeader("Host", "accounts.google.com");
post.setHeader("User-Agent", USER_AGENT);
post.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
post.setHeader("Accept-Language", "en-US,en;q=0.5");
post.setHeader("Cookie", getCookies());
post.setHeader("Connection", "keep-alive");
post.setHeader("Referer", "https://accounts.google.com/ServiceLoginAuth");
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
post.setEntity(new UrlEncodedFormEntity(postParams));
HttpResponse response = client.execute(post);
int responseCode = response.getStatusLine().getStatusCode();
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + postParams);
System.out.println("Response Code : " + responseCode);
BufferedReader rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
System.out.println(result.toString());
}
方法结尾处的print语句返回页面已“暂时移动”。
<HTML><HEAD><TITLE>Moved Temporarily</TITLE></HEAD><BODY BGCOLOR="#FFFFFF" TEXT="#000000"><H1>Moved Temporarily</H1>The document has moved <A HREF="https://accounts.google.com/CheckCookie?chtml=LoginDoneHtml&continue=https%3A%2F%2Faccounts.google.com%2FManageAccount&gidl=CAA">here</A>.</BODY></HTML>
我相信这是一个重定向,但我并不完全确定。这是主要方法:
public static void main(String[] args) throws Exception {
String url = "https://accounts.google.com/ServiceLoginAuth";
String gmail = "https://mail.google.com/mail/";
CookieHandler.setDefault(new CookieManager());
HttpCilentExample http = new HttpCilentExample();
String page = http.GetPageContent(url);
List<NameValuePair> postParams =
http.getFormParams(page, "example@gmail.com","examplePassword");
http.sendPost(url, postParams);
System.out.println("past here");
String result = http.GetPageContent(gmail);
System.out.println(result);
}
代码不会处理过去String result = http.GetPageContent(gmail);
我认为这与问题有关(这来自Handling HttpClient Redirects)
10.3.3 302发现...
如果收到302状态代码以响应其他请求 比GET或HEAD,用户代理不得自动重定向
除非可以由用户确认,否则请求,因为这可能是 改变发出请求的条件。
我试图覆盖isRedirected()
方法,但不确定我应该做什么。我是否会针对所有情况返回false,或检查 POST 个案的参数?
我不确定这是否是整个问题,我不确定我是否正确接近这个问题。
但是,如果有任何解释可以帮助我了解使用 Httpclient 登录网站的过程,我将不胜感激。