본문 바로가기
개발/Java

[Java] cURL - ProcessBuilder 사용하기

by 코딩하는 흰둥이 2023. 5. 24.

https://docs.oracle.com/javase/8/docs/api/index.html?help-doc.html 

 

Java Platform SE 8

 

docs.oracle.com

구글링도 좋지만 Api 확인을 생활화 하자(Process , ProcessBuilder 참고)

 

cURL 은 서버와 통신 할 수 있는 커맨드 명령어 툴이다

가장 많이 사용하는 프로토콜로는 HTTP/HTTPS 가 대표적이다

 

CMD(명령 프롬프트) - cURL 실행

curl --location --request GET http://www.google.co.kr 입력

 

cmd 에서 실행하였을때 www.google.co.kr 의 소스코드가 출력

 

Java 에서 cURL 실행
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class RunTestController {
    public static void main(String[] args) throws Exception {
        ProcessBuilder builder = null;
        Process process = null;
        InputStream in = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader bufferedReader = null;


        try {
            // 예시) curl --location --request GET http://www.google.co.kr
            // 옵션 값을 따로 이용할까 하여 각각 변수를 나누어 놓았으나 그냥 List에 add 시켜도 된다
            String url          = "http://www.google.co.kr";
            String firstOption  = "--location";
            String secondOption = "--request";
            String thridOption  = "GET";
            String curl         ="curl " + firstOption + " " + secondOption + " " + thridOption + " " + url;

            ArrayList<String> list = new ArrayList<>();
            
            // cmd 를 넣어줘야 실행이 될 것으로 생각했으나 기본적으로 cmd 실행이 됨
            //list.add("cmd.exe");
            
            list.add("curl");
            list.add(firstOption);
            list.add(secondOption);
            list.add(thridOption);
            list.add(url);

            // java 8 Api 문서 참조 ProcessBuilder
            builder = new ProcessBuilder();

            // List<String> 타입
            builder.command(list);
            
            // String... 타입
            //builder.command("cmd.exe", "/c" , curl);

            process = builder.start();

            in = process.getInputStream();

            // UTF-8 인데 한글이 깨짐
            //inputStreamReader = new InputStreamReader(in, "UTF-8");
            inputStreamReader = new InputStreamReader(in, "MS949");

            bufferedReader = new BufferedReader(inputStreamReader);

            String line = null;

            while((line = bufferedReader.readLine()) != null){
                System.err.println(line);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 순서대로 열고 마지막부터 닫아준다
            // 코드를 간결하게 줄이기보다는 동작하는 원리와 닫아줌을 생활화 하자
            if (bufferedReader != null){
                bufferedReader.close();
            }
            if (inputStreamReader != null){
                inputStreamReader.close();
            }
            if(in != null){
                in.close();
            }
            if(process != null){
                process.destroy();
            }
            if(builder != null ){
                builder = null;
            }
        }
    }
}

저번에 한 Https 와 비슷하다

 

주요 옵션
short long 설명 비고
-k --insecure https 사이트를 SSL certificate 검증없이 연결한다. wget 의 --no-check-certificate 과 비슷한 역할 수행
-l --head HTTP header 만 보여주고 content 는 표시하지 않는다  
-D --dump-header <file> <file> 에 HTTP header 를 기록한다.  
-L --location 서버에서 HTTP 301이나 HTTP 302 응답이 왔을 경우 redirection URL 로 따라간다.
--max-redirs 뒤에 숫자로 redirection 을 몇 번 따라갈지 지정할 수 있다. 기본 값은 50이다
curl -v daum.net 을 실행하면 결과값으로 다음과 같이 HTTP 302 가 리턴된다.
< HTTP/1.1 302 Object Moved
< Location: http://www.daum.net/
-L 옵션을 추가하면 www.daum.net 으로 재접속하여 결과를 받아오게 된다.
-d --data HTTP Post data FORM 을 POST 하는 HTTP나 JSON 으로 데이타를 주고받는 REST 기반의 웹서비스 디버깅시 유용한 옵션이다
-v --verbose  동작하면서 자세한 옵션을 출력한다.  
-J --remote-header-name 어떤 웹서비스는 파일 다운로드시 Content-Disposition Header 를 파싱해야 정확한 파일이름을 알 수 있을 경우가 있다. -J 옵션을 주면 헤더에 있는 파일 이름으로 저장한다. curl 7.20 이상부터 추가된 옵션
-o --output FILE curl 은 remote 에서 받아온 데이타를 기본적으로는 콘솔에 출력한다. -o 옵션 뒤에 FILE 을 적어주면 해당 FILE 로 저장한다. (download 시 유용)  
-O --remote-name file 저장시 remote 의 file 이름으로 저장한다. -o 옵션보다 편리하다.  
-s --silent 정숙 모드. 진행 내역이나 메시지등을 출력하지 않는다. -o 옵션으로 remote data 도 /dev/null 로 보내면 결과물도 출력되지 않는다 HTTP response code 만 가져오거나 할 경우 유리
-X --request Request 시 사용할 method 종류(GET, POST, PUT, PATCH, DELETE) 를 기술한다.  
-i --include 응답에 Content 만 출력하지 않고 서버의 Reponse 도 포함해서 출력한다. (디버깅에 유용)  

해당 사이트 참고함 https://www.lesstif.com/software-architect/curl-http-get-post-rest-api-14745703.html

댓글