httpclient redirect for newbies

10,457

Here's a sample adapted from the 'Response Handling' example here.

Your example is quite complicated - best to simplify your code while you figure out how to follow redirects (you can comment out the section I've highlighted to show the example failing to follow the redirect).

import org.apache.http.*;
import org.apache.http.client.*;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;
import org.apache.http.protocol.*;

public class ClientWithResponseHandler {

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

        DefaultHttpClient httpclient = new DefaultHttpClient();
        // Comment out from here (Using /* and */)...
        httpclient.setRedirectStrategy(new DefaultRedirectStrategy() {                
          public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context)  {
            boolean isRedirect=false;
            try {
              isRedirect = super.isRedirected(request, response, context);
            } catch (ProtocolException e) {
              e.printStackTrace();
            }
            if (!isRedirect) {
              int responseCode = response.getStatusLine().getStatusCode();
              if (responseCode == 301 || responseCode == 302) {
                return true;
              }
            }
            return false;
          }
        });
        // ...to here and the request will fail with "HttpResponseException: Moved Permanently"
        try {
            HttpPost httpPost = new HttpPost("http://news.bbc.co.uk/");
            System.out.println("executing request " + httpPost.getURI());
            // Create a response handler
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String responseBody = httpclient.execute(httpPost, responseHandler);
            System.out.println(responseBody);
            // Add your code here...
        } finally {
            // When HttpClient instance is no longer needed, shut down the connection 
            // manager to ensure immediate deallocation of all system resources
            httpclient.getConnectionManager().shutdown();
        }
    }

}
Share:
10,457
Brian
Author by

Brian

Updated on June 04, 2022

Comments

  • Brian
    Brian over 1 year

    Possible Duplicate:
    Httpclient 4, error 302. How to redirect?

    I want to retrieve some information from my comcast account. Using examples on this site, I think I got pretty close. I am using firebug to see what to post, and I see that when I login I am being redirected. I don't understand how to follow the redirects. I have played with countless examples but just can't figure it out. I am new to programming and just not having any luck doing this. Here is my code. I make an initial login, then go to try to go to another URL which is where the redirects begin. Along the way, I see that I am acquiring lots of cookies, but not the important one s_lst.

    HttpPost httpPost = new HttpPost("https://login.comcast.net/login");
    
            List <NameValuePair> nvps = new ArrayList <NameValuePair>();
            nvps.add(new BasicNameValuePair("continue", "https://login.comcast.net/account"));
            nvps.add(new BasicNameValuePair("deviceAuthn", "false"));
            nvps.add(new BasicNameValuePair("forceAuthn", "true"));
            nvps.add(new BasicNameValuePair("ipAddrAuthn", "false"));
            nvps.add(new BasicNameValuePair("lang", "en"));
            nvps.add(new BasicNameValuePair("passwd", "mypassword"));
            nvps.add(new BasicNameValuePair("r", "comcast.net"));
            nvps.add(new BasicNameValuePair("rm", "2"));
            nvps.add(new BasicNameValuePair("s", "ccentral-cima"));
            nvps.add(new BasicNameValuePair("user", "me"));
    
            httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
    
            System.out.println("executing request " + httpPost.getURI());
            // Create a response handler
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String responseBody = httpclient.execute(httpPost, responseHandler);
            String cima = StringUtils.substringBetween(responseBody, "cima.ticket\" value=\"", "\">");
            System.out.println(cima);
    
            HttpPost httpPost2 = new HttpPost("https://customer.comcast.com/Secure/Home.aspx");
    
            List <NameValuePair> nvps2 = new ArrayList <NameValuePair>();
            nvps2.add(new BasicNameValuePair("cima.ticket", cima));
    
            httpPost2.setEntity(new UrlEncodedFormEntity(nvps2, HTTP.UTF_8));
    
            System.out.println("executing request " + httpPost2.getURI());
            // Create a response handler
            ResponseHandler<String> responseHandler2 = new BasicResponseHandler();
            String responseBody2 = httpclient.execute(httpPost2, responseHandler2);
            System.out.println(responseBody2);