How do I handle a 302 redirect response to my 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');
        }
    }
    

    Welcome to SFSE, wixxey. Please be sure to read the FAQ. In the meantime, can you share some code demonstrating the API call? The more information we have the easier it is to help out.

    So you're calling out from SF?

    Are you sure the endpoint is valid ? It looks like you're successfully connecting to an old endpoint which is no longer operational at that url. It is my understanding that if you receive http status details, you were able to callout, but the problem lies with the service you're calling to. (authentication, parameters, downtime,...). I would only parse json after a status code 200.

    Have you tried setting your endpoint to where the 302 is pointing?

    Yes i am calling it from salesforce

    thats the problem i am facing ... i don't know how to set the new endpoint where 302 is pointing although one endpoint is already set

  • 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

License under CC-BY-SA with attribution


Content dated before 7/24/2021 11:53 AM

Tags used