curl은 command line 또는 script에서 데이터 전송을 위해 사용하는 라이브러리이다. HTTP, FTP 등 다양한 통신 프로토콜을 지원하며 SSL 인증 방식 역시 사용 가능하다.
curl은 현재 7.76.1 버전이 Stable 버전으로 릴리즈 되어있으며 Mac이나 Linux에서는 기본적으로 curl이 깔려있다.
curl 사용하기
$ curl http://localhost:8080
https://localhost:8080
을 GET 요청으로 조회하는 curl 명령이다. curl을 HTTP로 사용하는 경우에는 기본적으로 GET으로 조회한다.
HTTP에는 header가 존재하는데 curl에서는 -H 또는 —header 옵션을 통해 요청에 헤더 값을 추가할 수 있다.
$ curl http://localhost:8080 \
-H 'Accept: application/json'
-H
옵션으로 Accept 헤더를 추가하여 http://localhost:8080
에 요청한다.
> POST / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: application/json
다양한 HTTP Method 사용하기
HTTP에는 GET 이외에도 POST, PUT, DELETE 등의 Method를 지원한다. curl에서 이를 사용하기 위해서는 -X
또는 —request
옵션으로 사용하고자 하는 HTTP Method를 설정하여 사용할 수 있다.
$ curl -X POST http://localhost:8080
POST나 PUT같은 경우는 Request Body를 포함하여 요청 보낼 수 있다. 이를 위해서 -d
옵션을 사용할 수 있다.
$ curl -X POST http://localhost:8080 \
-d name=pkch \
-d age=29
-d는 application/x-www-form-urlencoded
를 사용한 것과 동일하게 서버에 데이터를 보낸다.
$ curl -X POST http://localhost:8080 \
-d "name=pkch&age=29"
-d를 일일이 쓰지 않고 쌍따옴표 ""
로 감싸서 한줄에 표현할수도 있다.
일반적으로 많이 사용하는 application/json
을 사용하고자 한다면 다음과 같이 -H
로 Content-Type: application/json
과 함께 Json 형식으로 data를 전달해야한다.
단, -d
는 application/x-www-form-urlencoded
으로 서버에 전송하므로 Content-Type
을 application/json
으로 지정하고 -d
나 --data-raw
로 json을 전송하면 된다.
$ curl -X POST http://localhost:8080/content-type/application-json \
-H 'Content-Type: application/json' \
--data-raw '{"string": "string"}'
@
를 활용하면 파일의 내용을 전달할 수 있다.
$ curl -X POST http://localhost:8080/content-type/application-json \
-H 'Content-Type: application/json' \
-d @test.json
즉, @
뒤에 온 파일인 test.json
을 Request Body로 전송한다.
참고로 —data-raw는
@
를 그냥 문자로 취급하므로 주의
PUT요청도 마찬가지로 할 수 있다.
$ curl -X PUT http://localhost:8080/content-type/application-json \
-H 'Content-Type: application/json' \
--data-raw '{ "string": "string"}'
DELETE 요청도 마찬가지로 할 수 있다.
$ curl -X DELETE http://localhost:8080/content-type/application-json
multipart/form-data 요청 보내기
파일 업로드하는 multipart/form-data
를 위해서는 -F
나 --form
옵션을 사용해야한다. 파일을 전송할 키와 함께 파일의 경로를 지정해주면 된다. 이때 파일 경로 지정시 prefix로 @
를 달아야한다.
$ curl -X POST http://localhost:8080/content-type/multipart-form-data \
-F 'file=@hello.jpg'
위와 같이 요청을 보내면 /content-type/multipart-form-data
이 URI로 요청할 때 file을 키로 hello.jpg
를 전송한다. 그외 다른 값들은 다음과 같이 @
없이 값을 할당하면 된다.
$ curl -X POST http://localhost:8080/content-type/multipart-form-data \
-F 'file=@hello.jpg' -F 'name=pkch'
위와 같이 요청하면 name
의 값이 pkch
로 요청한다.
Redirect 따라가기
어떤 요청의 경우 redirect 응답 3xx 대 응답
을 줄 때도 있다.
$ curl http://localhost:8080/redirect/naver
/redirect/naver
가 https://www.naver.com
으로 redirect하는 역할을 한다고 가정한다. 다만 실제 위 명령을 호출하면 아무것도 나오지 않는다.
$ curl -v http://localhost:8080/redirect/naver
-v
또는 —verbose
옵션을 줘서 요청 / 응답의 자세한 흐름을 보면 다음과 같이 나온다.
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /redirect/naver HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 302
< Location: https://www.naver.com
< Content-Language: ko-KR
< Content-Length: 0
< Date: Thu, 15 Apr 2021 10:29:34 GMT
<
* Connection #0 to host localhost left intact
* Closing connection 0
즉, 302 Redirect가 되면서 응답 Content가 존재하지 않기 때문에 아무것도 나타나지 않은 것이다. Redirect로 결과가 나타날때까지 따라가려면 -L
이나 --location
옵션을 주어야한다.
$ curl -L http://localhost:8080/redirect/naver
위와 같이 호출하면 /redirect/naver
가 redirect하는 https://www.naver.com
의 내용이 나타난다.
응답값 저장하기
curl은 기본적으로 요청의 결과를 터미널, 콘솔 등에 출력한다. curl로 받은 응답을 파일로 저장하고 싶다면 -o
옵션을 사용할 수 있다.
$ curl -o {파일명} https://www.naver.com
위 명령의 경우 https://www.naver.com
의 결과인 네이버 메인페이지 html을 지정한 파일명으로 저장한다.
$ curl -o naver.html https://www.naver.com
naver.html
에 https://www.naver.com
의 결과를 저장하는 것이다. 이를 활용해서 -o
를 파일 다운로드에 활용하기도 한다.
응답 헤더 확인하기
curl을 아무옵션없이 사용하면 서버의 응답 본문만 출력된다. 응답헤더는 따로 출력되지 않는데 응답헤더도 출력하고 싶다면 -i
나 -I
옵션을 사용하면된다. 전자는 응답헤더와 응답본문을 모두 출력해주고 후자는 응답헤더만을 출력한다.
$ curl -I https://www.naver.com
위와 같이 실행하면 다음과 같은 응답이 콘솔로 출력된다.
HTTP/2 200
server: NWS
date: Sun, 18 Apr 2021 07:46:57 GMT
content-type: text/html; charset=UTF-8
cache-control: no-cache, no-store, must-revalidate
pragma: no-cache
p3p: CP="CAO DSP CURa ADMa TAIa PSAa OUR LAW STP PHY ONL UNI PUR FIN COM NAV INT DEM STA PRE"
x-frame-options: DENY
x-xss-protection: 1; mode=block
strict-transport-security: max-age=63072000; includeSubdomains
referrer-policy: unsafe-url
여담으로 네이버는 HTTP/2를 지원하나보네요 :)
위와 같이 응답헤더만을 출력하는 -I
옵션을 사용해서 서버의 상태를 체크하는 용도로 많이 사용하곤 한다.
Reference
curl 공식페이지: https://curl.se/
curl 참고: https://www.lesstif.com/software-architect/curl-http-get-post-rest-api-14745703.html