How auto redirect in HttpClient (java, apache)

13,498

Solution 1

Due to design limitations HttpClient 3.x is unable to automatically handle redirects of entity enclosing requests such as POST and PUT. You either have to manually convert POST request to a GET upon redirect or upgrade to HttpClient 4.x, which can handle all types of redirects automatically.

Solution 2

In case of the 3.x version of HttpClient, you can also check if the response code is 301 or 302 and then use the Location header to re-post:

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);
}
Share:
13,498
Mediator
Author by

Mediator

I'm owner kitesurfing schools, lessons and equipment website.

Updated on June 18, 2022

Comments

  • Mediator
    Mediator almost 2 years

    I create httpClient and set settings

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

    First request (get)

    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;
        }
    }
    

    Response correct.

    Second request (post):

    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;
        }
    }
    

    this response is correct too, but I need to be redirected to Headers.Location.

    I do not know how to get value from Headers Location or how to automatically enable redirection.

  • Mediator
    Mediator almost 13 years
    Error - "Entity enclosing requests cannot be redirected without user intervention"
  • Dilini
    Dilini over 2 years
    You might have to use post.getResponseHeader("Location").getValue();