[Java] HttpURLConnection을 이용한 REST API 호출

해니·2023년 2월 1일
post-thumbnail



1. URLConnection 과 HttpURLConnection Class

  • Java 애플리케이션과 URL 간의 연결과 관련한 모든 클래스의 수퍼 클래스

  • URLConnection의 클래스는 일반적인 URL에 대한 API를 제공하고 , 서비 클래스인 HttpURLConnection는 HTTP 고유의 기능에 대한 추가 지원을 제공한다.

  • 두 클래스 모두 추상 클래스 이므로 , URLConnection 및 HttpURL Connection의 새 인스턴스를 직접 만들 수 없다. 대신 URL 객체에서 연결을 통해 URLConnection의 인스턴스를 얻는다.

  • 일반적으로 클라이언트 프로그램은 URL을 통해 서버와 통신할 때 다음 단계를 따른다.
    1) URL 객체 만들기
    2) URL에서 URLConnection 객체 얻기
    3) URL 연결 구성 (선택사항)
    4) 헤더 필드 읽기 (선택사항)
    5) 입력 스트림 가져오기 및 데이터 읽기 (선택사항)
    6) 출력 스트림 가져오기 및 데이터 읽기 (선택사항)
    7) 연결 닫기




1. URL 객체 생성

  • 다음과 같이 주어진 URL 주소에 대해 새 URL 객체를 생성한다.
    URL url = new URL("https://www.haeni.co.kr/api/v1/auth");       // 호출할 외부 API 를 입력한다.
  • URL 형식이 잘못된 경우 MalforedURLException을 throw 한다.




2. URL에서 URLConnection 객체 얻기

  • URLConnection 인스턴스는 URL 객체의 openConnection() 메소드 호출에 의하여 얻어진다.

  • 프로코톨이 http:// 인 경우 , 반환된 객체를 HttpURLConnection 객체로 캐스팅할 수 있다.

  • URL 객체 생성 시, URL 형식이 잘못된 경우 MalformedURLException을 throw한다.

    • 해당 예외는 IOException의 하위 클래스다.

      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 




3. URLConnection 구성

  • 실제로 연결을 설정하기 전에 타임아웃 , 캐시 , HTTP 요청 방법 등과 같이 클라이언트와 서버 간의 다양한 옵션을 설정할 수 있다.

  • setRequestMethod(String method)
    : HTTP 메소드 GET , POST , HEAD , OPTIONS , PUT , DELETE , TRACE 중 하나인 URL 요청에 대한 메소드를 설정한다. (기본값은 GET)

  • setRequestProperty(String ket ,String value)
    : key=value 쌍으로 지정된 일반 요청 속성을 설정한다. 키가 있는 속성이 이미 있는 경우 이전 값을 새 값으로 적용한다.

  • setDoOutput(boolean doOutput)
    : URLConnection이 서버에 데이터를 보내는데 사용할 수 있는지 여부를 설정한다. (기본값은 false)

    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type", "application/json");  //json으로 message를 전달하고자 할 때 
    conn.setRequestProperty("X-Test-Token", params.get("accessToken").toString());
    conn.setDoOutput(true);





4. 출력 스트림 가져오기 데이터 쓰기

  • URL 연결을 출력용으로 사용하려는 경우 DoOutput 플래그를 true로 설정해야 한다.

    conn.setDoOutput(true);
  • URL 연결과 관련된 출력 스트림 객체를 가져온 다음 데이터를 쓴다.

    • getOutputStream() 메소드는 IOException 또는 UnknownServiceException을 throw 할 수 있다.

      OutputStreamWriter os = new OutputStreamWriter(conn.getOutputStream());
      jsonStr = gson.toJson(params.get("req_data"));	// string -> jsonString 
      os.write(jsonStr);
      os.flush();




🔔 OutputStreamWriter

  • 문자 스트림을 바이트 스트림으로 변환하는 하위 스트림
  • 2byte를 처리할 수 있기 때문에 한글도 처리 가능
  • .write() 메서드를 통해서 출력





5. 입력 스트림 가져오기 데이터 쓰기

  • URL 연결에서 입력 스트림 인스턴스를 얻은 다음 데이터를 읽는다.

    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
    
    String line = "";
    
    	while ((line = br.readLine()) != null) {
    		sb.append(line.trim());
    	}
    
  • HTTP 상태 코드가 400보다 큰 경우 getErrorStream()으로 오류 메세지를 읽을 수 있다.

    br = new BufferedReader(new InputStreamReader(conn.getErrorStream(), "UTF-8"));




🔔 BufferedReader

  • 바이트 단위 입출력을 위한 하위 스트림 클래스
  • 문자열을 처리 가능
  • .readLine() 메서드를 사용하면 데이터 라인 단위로 읽을 수 있음





6. 연결 종료

  • URL 연결을 닫으려면 입출력 스트림 객체에서 close() 메소드를 호출하거나 , HttpURLConnection 객체에서 disconnect() 메소드를 호출한다.
    • close()를 사용해서 연결을 종료하는 경우, 다시 연결하려면 openConnection()을 다시 해줘야 한다.
    • disconnect()를 사용해서 연결을 종료하는 경우, connect() 메소드만 호출하면 바로 복구된다.
      os.close();
      br.close();
      conn.disconnect();









출처
https://lima1016.tistory.com/11
https://goddaehee.tistory.com/161
https://blueyikim.tistory.com/2199
https://digitalbourgeois.tistory.com/57
https://new-hero.tistory.com/5
https://blog.acronym.co.kr/537
http://daplus.net/java-java%EC%97%90%EC%84%9C-%EC%98%A4%EB%A5%98-%EC%9D%91%EB%8B%B5-%EB%B3%B8%EB%AC%B8-%EC%9D%BD%EA%B8%B0/
https://canworld42.tistory.com/180
https://ssamlee.tistory.com/10

profile
💻 ⚾️ 🐻 이전했어요..! ➡️ https://dev-haeni.tistory.com/

0개의 댓글