ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 02. JAVA HttpURLConnection 활용한 API 호출하기(GET, POST, DELETE)
    JAVA 2021. 12. 26. 17:33
    반응형

    JAVA HttpURLConnection을 활용하여 elasticsearch API를 호출합니다.

    elasticsearch API에서 제공하는 조회(GET) / 등록·수정(POST) / 삭제(DELETE) 기능을 활용하여 진행할 예정입니다.

    elasticsearch API 관련 정보는 아래 글에서 확인하여 주시기 바랍니다.

    https://cjy6179.tistory.com/26?category=904128 

     

    01. 엘라스틱서치(Elasticsearch) 6.8 설치 (Linux Centos7)

    엘라스틱서치(Elasticsearch) 루씬 기반의 검색엔진입니다. ( ※루씬(Lucene) : 자바 언어로 이루어진 정보 검색 라이브러리 자유-오픈 소스 소프트웨어입니다.) 엘라스틱서치(Elasticsearch)의 자세한 설

    cjy6179.tistory.com

     


    ▣ 사용한 JAVA class 정보

    - URL ( https://docs.oracle.com/javase/8/docs/api/java/net/URL.html )

    - URLConnection ( https://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html )

    - HttpURLConnection ( https://docs.oracle.com/javase/8/docs/api/java/net/HttpURLConnection.html )

    - InputStreamReader ( https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html )

    - BufferedReader ( https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html )

    - StringBuilder ( https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html )

    - DataOutputStream ( https://docs.oracle.com/javase/8/docs/api/java/io/DataOutputStream.html )

     


    ▣ 작업 순서

    1. HttpURLConnection 객체 생성

    2. API 호출하고 데이터 받기 (GET)

    3. API 호출하고 데이터 받기 (POST)

    4. API 호출하고 데이터 받기 (DELETE)

     

     


    1. HttpURLConnection 객체 생성

    public HttpURLConnection getHttpURLConnection() {
    		URL url;
    		HttpURLConnection conn = null;
    		try {
    			url = new URL("http://192.168.0.2:9201/twitter/_doc/1");
    			conn = (HttpURLConnection) url.openConnection();
    			conn.setRequestMethod("GET"); //Method 방식 설정. GET/POST/DELETE/PUT/HEAD/OPTIONS/TRACE
    			conn.setConnectTimeout(5000); //연결제한 시간 설정. 5초 간 연결시도
    			conn.setRequestProperty("Content-Type", "application/json");
    			
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch(IOException e) {
    			e.printStackTrace();
    		}
    		
    		return conn;
    		
    	}

     

    우선 사용할 API를 기반으로 URL 객체를 생성하여줍니다.

    (저의 경우는 elasticsearch API ("http://192.168.0.2:9201/twitter/_doc/1") 주소를 입력하여 줍니다. )

    URL.openConnection() 메소드를 호출하여 HttpURLConnection 객체를 생성합니다.

    openConnection() 메소드를 호출하면 URLStreamHandler에서 URLConnection 객체를 생성하여 리턴하여 줍니다.

    URLConnection 객체를 HttpURLConnection으로 변환하여 줍니다.

    그후 아래 메소드로 설정을 해주면 HttpURLConnection 객체 생성이 완료됩니다.

     

    <HttpURLConnection  설정기능>

    - setRequestMethod : URL 요청방법(GET/POST/HEAD/OPTIONS/PUT/DELETE/TRACE)을 설정합니다. (default : GET)

    - setRequestProperty : 일반 요청 속성을 설정합니다. (ContentType 등)

    - setReadTimeout : 읽기 제한 시간을 지정된 제한 시간(밀리초)으로 설정합니다.

    - setConnectTimeout : 통신 링크를 열 때 사용할 지정된 시간 초과 값(밀리초)을 설정합니다.

    - setDoInput : 데이터를 조회할 때 true 값으로 설정합니다. (default : true)

    - setDoOutput : 데이터를 보낼 때 true 값으로 설정합니다. (default : false)

     


    2. API 호출하고 데이터 받기 (GET)

    package common.http;
    
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    
    public class httpConnection {
    	
    	public static void main(String[] args) {
    		
    		HttpUtils htppUtils = new HttpUtils();
    		
    		String url = "http://192.168.0.2:9201/twitter/_doc/1";
    		String method = "GET";
    		String result = "";
    		HttpURLConnection conn = null;
    		
            //HttpURLConnection 객체 생성
    		conn = htppUtils.getHttpURLConnection(url, method);
    		//URL 연결에서 데이터를 읽을지에 대한 설정 ( defualt true )
            // conn.setDoInput(true); 
    		//API에서 받은 데이터를 StringBuilder 형태로 리턴하여 줍니다. 
            result = htppUtils.getHttpRespons(conn);
            //해당 정보를 확인합니다.
    		System.out.println("GET = " + result);
    
    	}
    }
    
    class HttpUtils {
    	
    	public HttpURLConnection getHttpURLConnection(String strUrl, String method) {
    		URL url;
    		HttpURLConnection conn = null;
    		try {
    			url = new URL(strUrl);
    
    			conn = (HttpURLConnection) url.openConnection(); //HttpURLConnection 객체 생성
    			conn.setRequestMethod(method); //Method 방식 설정. GET/POST/DELETE/PUT/HEAD/OPTIONS/TRACE
    			conn.setConnectTimeout(5000); //연결제한 시간 설정. 5초 간 연결시도
    			conn.setRequestProperty("Content-Type", "application/json");
                
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch(IOException e) {
    			e.printStackTrace();
    		}
    		
    		return conn;
    		
    	}
    	
    	public String getHttpRespons(HttpURLConnection conn) {
    		StringBuilder sb = null;
    
    		try {
    			if(conn.getResponseCode() == 200) {
                // 정상적으로 데이터를 받았을 경우
                	//데이터 가져오기
    				sb = readResopnseData(conn.getInputStream());
    			}else{
                // 정상적으로 데이터를 받지 못했을 경우
                
                	//오류코드, 오류 메시지 표출
    				System.out.println(conn.getResponseCode());
    				System.out.println(conn.getResponseMessage());
    				//오류정보 가져오기
    				sb = readResopnseData(conn.getErrorStream());
    				System.out.println("error : " + sb.toString());
    				return null;
    			}
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			conn.disconnect(); //연결 해제
    		};
    		if(sb == null) return null;
            
    		return sb.toString();
    	}
    	
    	public StringBuilder readResopnseData(InputStream in) {
    		if(in == null ) return null;
    
    		StringBuilder sb = new StringBuilder();
    		String line = "";
    		
    		try (InputStreamReader ir = new InputStreamReader(in);
    				BufferedReader br = new BufferedReader(ir)){
    			while( (line = br.readLine()) != null) {
    				sb.append(line);
    			}
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return sb;
    	}
    }

     

    getResponseCode() 값이 200(정상)일 경우 getInputStream() 메소드를 사용하여 return 값을 받아오고,

    200(정상)이 아닐 경우 getErrorStream()을 활용하여 해당 오류의 정보를 받아 옵니다.

    해당 정보들은 InputStream 형태의 데이터로 받아옵니다. 

    받아온 데이터(InputStream)를 기반으로 InputStreamReader 객체를 생성하고, BufferedReader에서 제공하는  readLine() 메소드를 활용하여 해당 정보를 String에 저장하고 그 정보를 StringBuilder에 저장하여 정보를 표출하여 줍니다.

    데이터를 읽고난 후에는 disconnect() 함수를 사용하여 연결을 해제하여줍니다.

    <오류가 발생한 경우>

    <정상적으로 데이터를 받은 경우>

     


    3. API 호출하고 데이터 받기 (POST)

    API에 데이터를 보내야할 경우 method는 POST로 변경하고 setDoOutput 옵션을 true로 변경합니다.

    보낼 데이터는 DataOutputStream 객체를 활용하여 만듭니다.

    다른 부분은 GET과 같습니다.

    보낼 데이터는 DataOutputStream 객체를 활용하여 만듭니다.

    writeBytes("String") 메소드를 활용하여 해당 정보를 stream에 저장할 준비를 합니다.

    dataOutputStream.flush(); 메소드를 활용하여 해당 정보를 stream에 저장합니다.

    conn.setDoOutput(true); //URL 연결시 데이터를 사용할지에 대한 설정 ( defualt false )
    try (DataOutputStream dataOutputStream = new DataOutputStream(conn.getOutputStream());){
    
      String str = "{\"user\" : \"kimchy\",    "
      + "\"post_date\" : \"2009-11-15T14:12:12\",    "
      + "\"message\" : \"trying out Elasticsearch\"}";
    
      dataOutputStream.writeBytes(str);
      dataOutputStream.flush();
    
      result = htppUtils.getHttpRespons(conn);
    
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

     


    4. API 호출하고 데이터 받기 (DELETE)

    위 GET방식과 동일하며 다른 점은 method를 DELETE로 바꾸어 주면 됩니다.

     

     

    아래는 전체 소스입니다.

    전체 소스

    package common.http;
    
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    public class httpConnection {
    	
    	public static void main(String[] args) {
    		String url = "http://192.168.0.2:9201/twitter/_doc/1";
    
    		httpTestByMethod(url, "GET");
    		
    		httpTestByMethod(url, "POST");
    		
    		httpTestByMethod(url, "DELETE");
    	}
    	
    	public static void httpTestByMethod(String url, String method) {
    		
    		HttpUtils htppUtils = new HttpUtils();
    		String result = "";
    		HttpURLConnection conn = htppUtils.getHttpURLConnection(url, method);;
    
    		if("GET".equalsIgnoreCase(method)){
    			
    			// conn.setDoInput(true); //URL 연결에서 데이터를 읽을지에 대한 설정 ( defualt true )
    			result = htppUtils.getHttpRespons(conn);
    		}else if("POST".equalsIgnoreCase(method)) {
    			
    			conn.setDoOutput(true); //URL 연결시 데이터를 사용할지에 대한 설정 ( defualt false )
    			try (DataOutputStream dataOutputStream = new DataOutputStream(conn.getOutputStream());){
    				
    				String str = "{\"user\" : \"kimchy\",    "
    						+ "\"post_date\" : \"2009-11-15T14:12:12\",    "
    						+ "\"message\" : \"trying out Elasticsearch\"}";
    				
    				dataOutputStream.writeBytes(str);
    				dataOutputStream.flush();
    				
    				result = htppUtils.getHttpRespons(conn);
    				
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}else if("DELETE".equalsIgnoreCase(method)) {			
    			result = htppUtils.getHttpRespons(conn);
    		}
    		
    		System.out.println("Method = " + method + "/ result = " + result);
    	}
    }
    
    
    class HttpUtils {
    	
    	public HttpURLConnection getHttpURLConnection(String strUrl, String method) {
    		URL url;
    		HttpURLConnection conn = null;
    		try {
    			url = new URL(strUrl);
    			
    			conn = (HttpURLConnection) url.openConnection();
    			conn.setRequestMethod(method); //Method 방식 설정. GET/POST/DELETE/PUT/HEAD/OPTIONS/TRACE
    			conn.setConnectTimeout(5000); //연결제한 시간 설정. 5초 간 연결시도
    			conn.setRequestProperty("Content-Type", "application/json");
    
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch(IOException e) {
    			e.printStackTrace();
    		}
    		
    		return conn;
    		
    	}
    	
    	public String getHttpRespons(HttpURLConnection conn) {
    		StringBuilder sb = null;
    
    		try {
    			if(conn.getResponseCode() == 200) {
    				//정상적으로 데이터를 받았을경우
    				sb = readResopnseData(conn.getInputStream());
    			}else{
    				//정상적으로 데이터를 받지 못한 경우 
    				System.out.println(conn.getResponseCode());
    				System.out.println(conn.getResponseMessage());
    				
    				sb = readResopnseData(conn.getErrorStream());
    				
    				System.out.println("error : " + sb.toString());
    				
    				return null;
    			}
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			conn.disconnect(); //연결 해제
    		};
    		
    		if(sb == null) return null;
    		
    		return sb.toString();
    	}
    	
    	public StringBuilder readResopnseData(InputStream in) {
    		
    		if(in == null ) return null;
    
    		StringBuilder sb = new StringBuilder();
    
    		String line = "";
    		
    		try (InputStreamReader ir = new InputStreamReader(in);
    				BufferedReader br = new BufferedReader(ir)){
    			while( (line = br.readLine()) != null) {
    				sb.append(line);
    			}
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		return sb;
    	}
    }

     

    <실행결과>

     

    궁금하신점은 댓글로 남겨주시기 바랍니다. 감사합니다.

    반응형

    'JAVA' 카테고리의 다른 글

    03. JAVA TIME Package 란?  (0) 2021.12.30
    99. JAVA 7 Try 문 자원해제 (try-with-resources)  (0) 2021.12.01

    댓글

Designed by Tistory.