pkch 2021. 4. 18. 16:53

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을 사용하고자 한다면 다음과 같이 -HContent-Type: application/json과 함께 Json 형식으로 data를 전달해야한다.

단, -dapplication/x-www-form-urlencoded으로 서버에 전송하므로 Content-Typeapplication/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/naverhttps://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.htmlhttps://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