본문 바로가기

JAVA

[JAVA] HttpURLConnection로 REST API 호출하기

728x90
반응형


이번 페이지에서는 HttpURLConnection을 이용해 REST API를 호출하는 방법을 알아보자.

[GET]

    public void get(String strUrl) {
        try {
            URL url = new URL(strUrl);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setConnectTimeout(5000); //서버에 연결되는 Timeout 시간 설정
            con.setReadTimeout(5000); // InputStream 읽어 오는 Timeout 시간 설정
            con.addRequestProperty("x-api-key", RestTestCommon.API_KEY); //key값 설정

            con.setRequestMethod("GET");

            //URLConnection에 대한 doOutput 필드값을 지정된 값으로 설정한다. URL 연결은 입출력에 사용될 수 있다. URL 연결을 출력용으로 사용하려는 경우 DoOutput 플래그를 true로 설정하고, 그렇지 않은 경우는 false로 설정해야 한다. 기본값은 false이다.
            con.setDoOutput(false);

            StringBuilder sb = new StringBuilder();
            if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
                //Stream을 처리해줘야 하는 귀찮음이 있음. 
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(con.getInputStream(), "utf-8"));
                String line;
                while ((line = br.readLine()) != null) {
                    sb.append(line).append("\n");
                }
                br.close();
                System.out.println("" + sb.toString());
            } else {
                System.out.println(con.getResponseMessage());
            }

        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }

 

[POST]

    public void post(String strUrl, String jsonMessage){
        try {
            URL url = new URL(strUrl);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setConnectTimeout(5000); //서버에 연결되는 Timeout 시간 설정
            con.setReadTimeout(5000); // InputStream 읽어 오는 Timeout 시간 설정
            con.addRequestProperty("x-api-key", RestTestCommon.API_KEY); //key값 설정

            con.setRequestMethod("POST");

            //json으로 message를 전달하고자 할 때 
            con.setRequestProperty("Content-Type", "application/json");
            con.setDoInput(true);
            con.setDoOutput(true); //POST 데이터를 OutputStream으로 넘겨 주겠다는 설정 
            con.setUseCaches(false);
            con.setDefaultUseCaches(false);

            OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
            wr.write(jsonMessage); //json 형식의 message 전달 
            wr.flush();

            StringBuilder sb = new StringBuilder();
            if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
                //Stream을 처리해줘야 하는 귀찮음이 있음.
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(con.getInputStream(), "utf-8"));
                String line;
                while ((line = br.readLine()) != null) {
                    sb.append(line).append("\n");
                }
                br.close();
                System.out.println("" + sb.toString());
            } else {
                System.out.println(con.getResponseMessage());
            }
        } catch (Exception e){
            System.err.println(e.toString());
        }
    }

 

[참고 사항]
public abstract void connect() throws IOException : 아직 접속이 이루어지지 않은 경우 현재 URL 이 참조하는 자원에 대한 통신 링크를 연다. 이미 접속이 이루어진 경우는 별 다른 조처를 취하지 않는다. 이 메서드는 추상 메서드이므로 각 프로토콜에 따른 URLConnection 부분 클래스에서 구체적인 접속 방법이 정의되어야 한다.

public void setDoInput(boolean doinput) : URLConnection에 대한 doInput 필드값을 지정된 값으로 설정한다. URL 연결은 입출력에 사용될 수 있다. URL 연결을 입력용으로 사용하려는 경우 DoInput 플래그를 true로 설정하고, 그렇지 않은 경우는 false로 설정해야 한다. 기본값은 DoOutput이 명시적으로 true로 설정되지 않은 경우 true이며, 이때 DoInput의 기본값은 false이다.

public InputStream getInputStream() throws IOException : 열린 연결에서 읽은 입력 스트림을 리턴한다.

public void setDoOutput(boolean dooutput) : URLConnection에 대한 doOutput 필드값을 지정된 값으로 설정한다. URL 연결은 입출력에 사용될 수 있다. URL 연결을 출력용으로 사용하려는 경우 DoOutput 플래그를 true로 설정하고, 그렇지 않은 경우는 false로 설정해야 한다. 기본값은 false이다.

public OutputStream getOutputStream() throws IOException : 연결에 기록한 출력 스트림을 리턴한다.

public String getHeaderField(int n) : n번째 헤더 필드의 값을 되돌린다. 만약 이 헤더에 n보다 적은 필드가 있으면 null을 되돌린다.

public Object getContent() throws IOException : 현재 URLConnection의 컨텐츠를 검색하여 그 결과를 되돌린다. 이 때 먼저 getContentType()메서드를 호출해 현재 URLConnection의 컨텐트 유형을 결정하는데, 만약 이 컨텐트 유형이 이미 알고 있는 것이 아니고 처음 보는 것이라면 다음 과정을 통해 이 유형에 대한 컨텐트 헨들러content handler가 생성된다.

1. 만약 애플리케이션이 setContentHandlerFactory()메서드를 이용해 컨텐트 헨들러 공장 인스턴스를 설치했다면, 이 인스턴스의 createContentHandler()메서드가 그 컨텐트 유형을 인자로 하여 호출된다. 그러면 그 컨텐트 유형에 맞는 컨텐트 헨들러가 되돌려진다.

2. 만약 아직 컨텐트 헨들러 공장 인스턴스가 설치되지 않았거나 createContentHandler()메서드가 null을 되돌리면, 그 애플리케이션은 다음과 같은 명칭의 클래스를 탑재한다.

‘sun.net.www.content.<contentType>’ 여기서 <contentType>는 컨텐트 유형을 나타내는 스트링으로, 이 스트링 중에 모든 슬래시 '/'는 마침표 '.'로, 알파뉴메릭 문자(영문자 알파벳 및 숫자)가 아닌 것은 밑줄 '_'로 대치된다.

3. 만약 지정한 클래스가 존재하지 않거나, 있더라도 그것이 ContentHandler의 부분클래스가 아니면, UnknownServiceException가 던져진다.

 

간단한 코드를 작성하는데 있어서도 설정 및 처리해줘야 하는 부분이 많아 적지않게 불편함이 있다. 무엇보다 가볍고 속도면에서 빠르다는 것이 느껴지지만 생산성이 많이 떨어지고 실제 프로젝트에 도입시에는 개발자가 핸들링 해줘야 하는 부분이 많아 보인다. 즉, 개발자의 역량에 비례하게 서비스 품질도 나올 것 같다. HttpURLConnection를 자신의 프로젝트에 선택하였다면 많은 학습과 고민 후에 적용할 것을 추천한다.

728x90
반응형