제임스딘딘의
Tech & Life

개발자의 기록 노트/Android

[안드로이드] http에 request요청시 - redirect 하는 방법

제임스-딘딘 2010. 12. 6. 19:03

HTTP request요청시 redirect 하는 방법 및 예제코드

안드로이드 앱을 만들다보면 http로 request를 보냈는데, 서버에서 url주소를 redirect해서 response를 보내주는 경우가 있다. 

그럼 개발자가 의도한 동작이나 입력한 주소로는 요청이 안되게 된다. 이걸 해결하기위해서는 java에서 redirect된 주소로 다시 요청을 해줘야 한다. 

상당히 귀찮다.

예제를 보여주겠다. 이를 응용하거나, 바로 가져다 사용하면 귀찮은 작업을 덜 수 있다.

private InputStream openConnectionCheckRedirects(URLConnection c) throws IOException  
{
    boolean redir; 
    int redirects = 0; 
    InputStream in = null; 
    do 
    {
        if (c instanceof HttpURLConnection)  
        {
            ((HttpURLConnection) c).setInstanceFollowRedirects(false); 
        }
        in = c.getInputStream();  
        redir = false;  
        if (c instanceof HttpURLConnection)  
        {
            HttpURLConnection http = (HttpURLConnection) c; 
            int stat = http.getResponseCode(); 
            if (stat >= 300 && stat <= 307 && stat != 306 && 
                stat != HttpURLConnection.HTTP_NOT_MODIFIED)  
            {
                URL base = http.getURL(); 
                String loc = http.getHeaderField("Location"); 
                URL target = null; 
                if (loc != null)  
                {
                    target = new URL(base, loc); 
                }
                http.disconnect();
                if (target == null || !(target.getProtocol().equals("http") 
                    || target.getProtocol().equals("https")) 
                    || redirects >= 5) 
                {
                    throw new SecurityException("illegal URL redirect"); 
                }
                redir = true; 
                c = target.openConnection(); 
                redirects++;
            }
        }
    } 
    while (redir); 
    return in; 
}

public void makeConnection(URL url){ 
    URLConnection conn = url.openConnection(); 
    InputStream is = openConnectionCheckRedirects(conn); 

    /* request에 대한 결과 처리 부분*/

    is.close();
}

이런식으로 하면 되겠다. 서버에서 제공하는 API가 redirect된 주소로 해서 보내주는 경우가 많기에... 이 방법을 써서 해결하게 되었다.

만약 개선할 점이 있거나, 더 좋은 방법이 있다면 언제든지 댓글로 남겨주시면 좋을 것 같다.