Как автоматически перенаправить в HttpClient (Java, Apache) - PullRequest
6 голосов
/ 30 апреля 2011

Я создаю 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.

Я не знаю, как получить значение из местоположения заголовков или как автоматически включить перенаправление.

Ответы [ 4 ]

7 голосов
/ 30 апреля 2011

Из-за конструктивных ограничений HttpClient 3.x не может автоматически обрабатывать перенаправления запросов, содержащих объекты, такие как POST и PUT. Вы должны либо вручную преобразовать POST-запрос в GET при перенаправлении, либо обновить его до HttpClient 4.x, который может автоматически обрабатывать все типы перенаправлений.

1 голос
/ 30 июня 2014

В случае версии 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);
}
0 голосов
/ 13 марта 2014

Также вы можете использовать LaxRedirectStrategy

0 голосов
/ 30 апреля 2011

Вам просто нужно добавить это:

second.setFollowRedirects(true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...