【问题标题】:How auto redirect in HttpClient (java, apache)如何在 HttpClient (java, apache) 中自动重定向
【发布时间】:2011-04-30 08:59:00
【问题描述】:

我创建 httpClient 并设置设置

HttpClient client = new HttpClient();

client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
client.getParams().setContentCharset("UTF-8");

第一个请求(获取)

GetMethod first = new GetMethod("http://vk.com");
int returnCode = client.executeMethod(first);

BufferedReader br = null;
String lineResult = "";
if (returnCode == HttpStatus.SC_NOT_IMPLEMENTED) {
    System.err.println("The Post method is not implemented by this URI");
    // still consume the response body
    first.getResponseBodyAsString();
} else {
    br = new BufferedReader(new InputStreamReader(first.getResponseBodyAsStream(), Charset.forName("windows-1251")));
    String readLine = "";
    while (((readLine = br.readLine()) != null)) {
        lineResult += readLine;
    }
}

回答正确。

第二个请求(发布):

PostMethod second = new PostMethod("http://login.vk.com/?act=login");

second.setRequestHeader("Referer", "http://vk.com/");

second.addParameter("act", "login");
second.addParameter("al_frame", "1");
second.addParameter("captcha_key", "");
second.addParameter("captcha_sid", "");
second.addParameter("expire", "");
second.addParameter("q", "1");
second.addParameter("from_host", "vk.com");
second.addParameter("email", email);
second.addParameter("pass", password);

returnCode = client.executeMethod(second);

br = null;
lineResult = "";
if (returnCode == HttpStatus.SC_NOT_IMPLEMENTED) {
    System.err.println("The Post method is not implemented by this URI");
    // still consume the response body
    second.getResponseBodyAsString();
} else {
    br = new BufferedReader(new InputStreamReader(second.getResponseBodyAsStream()));
    String readLine = "";
    while (((readLine = br.readLine()) != null)) {
        lineResult += readLine;
    }
}

这个响应也是正确的,但我需要被重定向到 Headers.Location。

我不知道如何从 Headers Location 获取值或如何自动启用重定向。

【问题讨论】:

    标签: java apache httpclient


    【解决方案1】:

    由于设计限制,HttpClient 3.x 无法自动处理包含实体的请求(例如 POST 和 PUT)的重定向。您要么必须在重定向时手动将 POST 请求转换为 GET,要么升级到可以自动处理所有类型的重定向的 HttpClient 4.x。

    【讨论】:

      【解决方案2】:

      如果是3.x版本的HttpClient,也可以检查响应码是301还是302,然后使用Location头重新发布:

      client.executeMethod(post);
      int status = post.getStatusCode();
      if (status == 301 || status == 302) {
        String location = post.getResponseHeader("Location").toString();
        URI uri = new URI(location, false);
        post.setURI(uri);
        client.executeMethod(post);
      }
      

      【讨论】:

      • 您可能必须使用post.getResponseHeader("Location").getValue();
      【解决方案3】:

      你只需要添加这个:

      second.setFollowRedirects(true);
      

      【讨论】:

      • 错误 - “没有用户干预无法重定向实体封闭请求”
      【解决方案4】:

      另外,您可以使用LaxRedirectStrategy

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多