▶︎ Client URL
curl
명령어는 프로토콜들을 이용해 URL로 데이터를 전송하여 서버에 데이터를 보내거나 가져올 때 사용하기 위한 명령줄 도구 및 라이브러리이다.
쉽게 말하면 SHELL(커맨드 라인 환경)에서 REST API(http) 테스트 하고 싶으면 curl
명령어를 사용하면 된다
▶︎ curl 설치
# ubuntu
$ sudo apt update
$ sudo apt-get install -y curl
# centos
$ sudo yum update
$ sudo yum install curl
▶︎ curl 사용법
특정 URL을 대상으로 동작하고 URL 앞에는 curl
옵션을 사용하면 된다.
$ curl [options ..] <url>
short | long | 설명 |
---|---|---|
-k | --insecure | https 프로토콜에서 SSL 인증서에 대한 검증없이 연결 |
-i | --head | HTTP 헤더만 보여주고 컨텐츠는 표시하지 않음 |
-D | --dump-header |
HTTP 헤더를 file에 기록 (덤프) |
-L | --location | HTTP 301, 302 응답을 받은 경우 리디렉션 URL로 따라간다 --max-redirs 옵션 뒤에 숫자로 몇 번의 리디렉션까지 따라갈 것인지를 적을 수 있다 기본 값은 50이다 |
-d | --data | HTTP POST 요청 데이터 입력 |
-v | --verbose | 동작하면서 세세한 내용을 출력 |
-J | --remote-header-name | 헤더에 있는 파일 이름으로 다운로드 파일을 저장 |
-o | --output FILE | curl로 받아온 내용을 FILE 이라는 이름의 파일로 저장 |
-O | --remote-name | 파일 저장시 리모트에 저장되어 있던 이름을 그대로 가져와서 로컬에 저장 |
-s | --silent | 진행 내용이나 메시지들을 출력하지 않음 HTTP response code 만 가져오거나 할 경우 유리 |
-X | --request | 요청시 사용할 메소드의 종류 (GET, POST, PUT, PATCH, DELETE) |
-i | --include | 응답에 Content 만 출력하지 않고 서버의 Reponse 도 포함해서 출력한다. (디버깅에 유용) |
-A | --user-agent | 서버에 User-Agent |
-H | 전송할 헤더를 지정 | |
-J | --remote-header-name | 어떤 웹서비스는 파일 다운로드시 Content-Disposition Header 를 파싱해야 정확한 파일이름을 알 수 있을 경우가 있다.-J 옵션을 주면 헤더에 있는 파일 이름으로 저장한다. |
-v | --verbose | 동작하면서 자세한 헤더 통신 옵션을 출력한다. |
-C | --continue-at | 파일 다운로드 재개 |
‣ GET 요청
- 터미널 창에
example.com
홈페이지의 소스 코드를 인쇄 - 프로토콜을 지정하지 않은 경우,
curl
은 사용할 프로토콜을 추측하려고 시도하며,이 프로토콜은 HTTP로 기본 설정됨 - 아무 옵션을 적지 않은 경우 기본적으로
GET
방식으로 동작
GET data 전송 방법
$ curl www.example.com
$ curl -X GET www.example.com
$ curl -G http://127.0.0.1/ -d key=value -d key2=value2
‣ POST 요청
-d
옵션으로 body 파라미터를 앞에 쓰고, 그 뒤에 POST를 처리하는 주소를 넣는다.- 파라미터는 무조건 먼저 인코딩 된 상태여야 한다.
- POST의 기본 Content-Type 은
application/x-www-form-urlencoded
이다.
POST data 전송방법
$ curl http://127.0.0.1/ -d key=value -d key2=value2
$ curl http://127.0.0.1/ -d "key=value&key2=value2"
$ curl -X POST -d "key=value" http://127.0.0.1/
url 형식 데이터
$ curl -d "key1=value1&key2=value2" \ # -d 옵션으로 body 데이터를 기재
-H "Content-Type: application/x-www-form-urlencoded" \ # -H 옵션으로 전송할 헤더 지정 (디폴트 : application/x-www-form-urlencoded)
-X POST http://localhost:80/test-data # -X 옵션으로 POST 메소드 지정하고 요청할 url명시
JSON 형식 데이터
$ curl -d '{"key1":"value1", "key2":"value2"}' \
-H "Content-Type: application/json" \
-X POST http://localhost:8000/data
파라미터값을 파일로 지정해서 보내기
curl -d "@data.txt" -X POST http://localhost:3000/data
curl -d "@data.json" -X POST http://localhost:3000/data
‣ 출력을 파일로 저장
-o
는 미리 정의된 파일 이름을 사용하여 파일을 저장-O
는 파일을 원래 파일 이름으로 저장-o
옵션과 함께curl
명령어를 실행하면 다운로드에 대한 진행률 표시기가 표시됨.
# mygettext.html 라는 파일로 저장
$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
# 파일 이름 그대로 저장
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
# 출력 재지정 연산자로 파일 저장
$ curl -L http://www.gnu.org/software/gettext/manual/gettext.html > mygettext.html
‣ 헤더 보기
-I
: 헤더만 가져오기-i
: 헤더와 바디까지 가져오기
헤더정보 보기 -I
$ curl -I google.com
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.co.kr/?gfe_rd=cr&ei=NKoMV5TZCILD8AfCsqToCw
Content-Length: 261
Date: Tue, 12 Apr 2016 07:56:36 GMT
헤더 + 본문 보기 -i
# 헤더 + 본문 보기 -i
$ curl -i google.com
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.co.kr/?gfe_rd=cr&ei=gqoMV9mPLczU8AefxoxA
Content-Length: 259
Date: Tue, 12 Apr 2016 07:57:54 GMT
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.kr/?gfe_rd=cr&ei=gqoMV9mPLczU8AefxoxA">here</A>.
</BODY></HTML>
‣ 페이지 상태체크
-o /dev/null
: 응답을 /dev/null로 리다이렉트하여 출력을 없애는 옵션입니다. '/dev/null'은 특수한 파일로, 모든 데이터가 무시되는 빈 파일입니다. 이 옵션을 사용하면 실제 응답 내용을 화면에 출력하지 않고 버릴 수 있습니다.-w "%{http_code}"
:-w
옵션은 curl이 출력하는 정보를 형식화하는 옵션입니다. 이 경우, "%{http_code}"는 HTTP 상태 코드를 형식화하여 출력하도록 지정한 것입니다. "%{http_code}"는 curl이 받은 HTTP 응답의 상태 코드를 나타냅니다. 예를 들어, 200은 OK, 404는 Not Found, 500은 Internal Server Error 등의 상태 코드가 될 수 있습니다.-s
: 이 옵션을 사용하면 curl 명령어가 실행될 때 진행 상황이 출력되지 않고, 결과만 반환 됩니다.
$ curl -s -o /dev/null -w "%{http_code}" https://blog.leocat.kr
위의 curl
명령어를 실행하면 "https://blog.leocat.kr/" 주소로 HTTP GET
요청을 보내고,
서버로부터 받은 응답을 /dev/null
로 리다이렉트하여 출력을 없애고, 응답의 HTTP 상태 코드
를 출력하게 됩니다.
예를 들어, 만약 서버로부터의 응답이 200이라면 "200"이라는 상태 코드가 curl
에 의해 출력될 것입니다.
▶︎ wget / curl 차이점
wget
과 curl
두 명령어 모두 웹 서버로부터 컨텐츠를 가져오는 Linux 커맨드이다.
curl
$ curl -X GET http://127.0.0.1:8080/animal
$ curl -X POST http://127.0.0.1:8080/animal
$ curl -d 'cat,dog' -H "Content-Type: application/text" -X POST http://127.0.0.1:8080/animal
wget
$ wget GET http://127.0.0.1:8080/animal
$ wget POST http://127.0.0.1:8080/animal
$ wget -O- --post-data='cat,dog' --header='Content-Type:application/text' 'POST http://127.0.0.1:8080/animal'
❗️ INFO
[ wget / curl 공통점 ]
HTTP, HTTPS, FTP 프로토콜을 통해 컨텐츠를 다운로드 하는 커맨트 라인툴
HTTP POST request 를 지원
HTTP 쿠키를 지원
❗️ INFO
[ wget / curl 차이점 ]
wget
간단하고 직관적 (만약, 별다른 옵션없이 컨텐츠를 조금 더 빠르게 다운로드하려고 한다면 wget 이 적합)
별도의 라이브러리를 지원하지 않음
재귀적으로 다운로드즉, 페이지에 있는 모든 내용이나 FTP 디렉터리에 있는 모든 파일들을 한 번에 그대로 복사
curl 에 비하여 더 오래되었음
curl
복잡한 컨텐츠를 다운로드 하려고 한다면 wget 보다는 curl 이 적합
libcurl 라이브러리로 더 강력한 기능들을 추가/사용할 수 있음
stdin 또는 stdout 의 pipe 를 이용하는 전통적인 unix 스타일의 방식도 지원
LDAP 이나 Samba 공유도 지원양방향 (wget 은 일반 HTTP POST request 만 지원)
SSL 을 지원gzip 압축 및 해지를 지원