初次登录成功后,HttpGet client.execute(请求)没有响应

时间:2016-05-06 00:16:26

标签: java apache cookies http-headers apache-httpclient-4.x

我正在尝试登录this site并收集一些数据。 我从下面共享的代码中删除了用户名和密码,但是当它获取第一个URL和密码并运行时,我得到一个响应,显示登录成功,但是在保存cookie并尝试运行第二个链接后查询它刚刚挂起的网站。没有错误也没有回应。我玩了几个小时,但是不能得到它。它被卡在这个链接运行的client.execute(request)(http:// sef.imapp。com / ilinks / property?upin = US120860131120280120& report = comps& distance = 0.5)

我从http://www.mkyong.com/java/apache-httpclient-examples/(第3部分)复制了代码并进行了更改,直到我显示已登录的响应html页面,但我无法运行查询网址。

我感谢任何帮助,需要详细解释。 谢谢。

package connectors;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class HttpCilentExampleToMls {

  private String cookies;
  private HttpClient client = HttpClientBuilder.create().build();
  private final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.36 Safari/537.36";

  public static void main(String[] args) throws Exception {

    //Login page Changed from google address
    String url = "http://sef.imapp.com/ilinks/search";
    //Search page Changed from gmail address
    String mlsUrl = "http://sef.imapp.com/ilinks/property?upin=US120860131120280120&report=comps&distance=0.5";

    // make sure cookies is turn on
    CookieHandler.setDefault(new CookieManager());

    HttpCilentExampleToMls http = new HttpCilentExampleToMls();

    String page = http.GetPageContent(url);

    List<NameValuePair> postParams = 
                // Changed from "Username" and "Password"
               http.getFormParams(page, "Username","Password");

    http.sendPost(url, postParams);
    String result = http.GetPageContent(mlsUrl);
  }

  private void sendPost(String url, List<NameValuePair> postParams) 
        throws Exception {

    HttpPost post = new HttpPost(url);

    // add header
    post.setHeader("Host", "sef.imapp.com");
    post.setHeader("User-Agent", USER_AGENT);
    post.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
    post.setHeader("Accept-Language", "en-US,en;q=0.8");
    post.setHeader("Cookie", getCookies());
    post.setHeader("Connection", "Keep-Alive");
    post.setHeader("Referer", "http://sef.imapp.com/ilinks/login?logout=true");
    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.err.println(line);
    }

    // System.out.println(result.toString());

  }

  private String GetPageContent(String url) throws Exception {

    HttpGet request = new HttpGet(url);

    request.setHeader("User-Agent", USER_AGENT);
    request.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
    request.setHeader("Accept-Language", "en-US,en;q=0.8");
    HttpResponse response = client.execute(request);
    int responseCode = response.getStatusLine().getStatusCode();

    System.out.println("\nSending 'GET' request to URL : " + url);
    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);
    }
    // set cookies
    setCookies(response.getFirstHeader("Set-Cookie") == null ? "" : 
                     response.getFirstHeader("Set-Cookie").toString());
    return result.toString();
  }

  public List<NameValuePair> getFormParams(
             String html, String username, String password)
            throws UnsupportedEncodingException {

    System.out.println("Extracting form's data...");

    Document doc = Jsoup.parse(html);

    // Google form id
    Element loginform = doc.getElementById("standardLogin");
    Elements inputElements = loginform.getElementsByTag("input");


    List<NameValuePair> paramList = new ArrayList<NameValuePair>();

    for (Element inputElement : inputElements) {
        String key = inputElement.attr("name");
        String value = inputElement.attr("value");

        if (key.equals("user"))
            value = username;
        else if (key.equals("passwd"))
            value = password;

        paramList.add(new BasicNameValuePair(key, value));

    }

    return paramList;
  }

  public String getCookies() {
    return cookies;
  }

  public void setCookies(String cookies) {
    this.cookies = cookies;
  }

}

1 个答案:

答案 0 :(得分:1)

我在mkyong上完全尝试代码时遇到了同样的问题,网站上的评论解决了这个问题:使用HttpGetHttpPost对象后,请使用方法releaseConnection()。< / p>

  

Alex Loginov 8个月之前您好,可能对某人有所帮助:之后   您收到回复,请关闭HttpPost(HttpGet):   post.releaseConnection();否则,2次之后你就没有自由   连接,必须无限期等待他们释放 - 不   异常将被抛出。