[SalesForce] How to handle a 302 redirect response to the HTTP callout

I am accessing an API, but when i debug the response it shows this message [Status=Moved Temporarily, StatusCode=302]. what should i do to access my required response.. my code is given below

public class WebServiceCall{

    public String getResult{get;set;}

    public PageReference submit() {
        getResult=getData();
        return null;
    }

    public String getData()
    {
        HttpRequest req= new HttpRequest();
         Http http = new Http();
        req.setMethod('GET');
        String url = 'http://www.geocko.com/api/orders/?app_id=xxxxxxxxxxxxx';
        req.setEndpoint(url);
        HttpResponse res = http.send(req);
        String json =  res.getBody();
        System.debug(res.getBody());  
        try {
            JSONObject j = new JSONObject( json );
            return parseJson(j);
        } catch (JSONObject.JSONException e) {
            return 'Error parsing JSON response from Web: '+e;
        }   
    }

    public String parseJson(JSONObject resp){
        return resp.getString('type');
    }
}

Best Answer

It has been a month since the original post, but hopefully this helps someone else out in the same situation. I handle a similar situation when logging into Site Minder protected pages. I use the code below to deal with sites that throw out an unknown amount of redirects.

Http http = new Http();
HttpRequest req = new HttpRequest();
HttpResponse res = new HttpResponse();
// do your initial http call here
req.setMethod('GET');
req.setEndpoint('http://www.cloudywithachanceofcode.com/redirect1.php');
res = http.send(req);
// redirection checking
boolean redirect = false;
if(res.getStatusCode() >=300 && res.getStatusCode() <= 307 && res.getStatusCode() != 306) {
    do {
        redirect = false; // reset the value each time
        String loc = res.getHeader('Location'); // get location of the redirect
        if(loc == null) {
            redirect = false;
            continue;
        }
        req = new HttpRequest();
        req.setEndpoint(loc);
        req.setMethod('GET');
        res = http.send(req);
        if(res.getStatusCode() != 500) { // 500 = fail
            if(res.getStatusCode() >=300 && res.getStatusCode() <= 307 && res.getStatusCode() != 306) {
                redirect= true;
            }
            // I do special handling here with cookies
            // if you need to bring a session cookie over to the
            // redirected page, this is the place to grab that info
        }
    } while (redirect && Limits.getCallouts() != Limits.getLimitCallouts());
}
//congratulations you're outside of the redirects now
//read what you need from the res object
system.debug(res.getBody());

It looks for a redirect HTTP response code and then grabs the location from the headers, and repeats the process until it gets a normal response or falls through without a proper response.

You could add some more checks for other status codes as well. Check here for the status codes if you're not familiar with them.

https://developer.mozilla.org/en-US/docs/HTTP/HTTP_response_codes