Curl은 HTTP 요청에 자주 사용되는 인기 있는 명령 줄 도구입니다. Curl은 다양한 다른 프로토콜을 지원하지만 Node.js 개발자는 이 프로토콜을 사용하여 RESTful API에 대한 HTTP 요청을 할 것입니다.
http://thecodebarbarian.com/what-javascript-developers-should-know-about-curl.html
안타깝게도 curl 문서에는 지원되는 명령 줄 플래그가 383으로 나열되어있어 원하는 것을 찾기가 어렵습니다. 이 기사에서는 우수한 httpbin.org 서비스를 예로 들어 curl에서 가장 자주 사용하는 패턴을 나열합니다.
HTTP GET 요청하기
먼저 curl --version을 실행하여 curl이 설치되어 있는지 다시 확인하십시오.
$ curl --version
curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.1 zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3
Release-Date: 2018-01-24
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL
HTTP GET 요청을 하려면 curl <url> 만 실행하면 됩니다. 예를 들어 https://httpbin.org/get?answer=42에 HTTP GET 요청을 하려면 curl https://httpbin.org/get?answer=42를 실행할 수 있습니다.
$ curl https://httpbin.org/get?answer=42
{
"args": {
"answer": "42"
},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.58.0",
"X-Amzn-Trace-Id": "Root=1-5ee8d737-b39c6a466892725bbb52b916"
},
"origin": "69.84.111.39",
"url": "https://httpbin.org/get?answer=42"
}
$
HTTP 요청이 성공하면 curl은 HTTP 응답 본문을 인쇄합니다. curl 을 응답 헤더를 포함한 전체 응답으로 인쇄하려면 -i 플래그를 사용하십시오.
$ curl -i https://httpbin.org/get?answer=42
HTTP/2 200
date: Tue, 16 Jun 2020 14:30:57 GMT
content-type: application/json
content-length: 801
server: istio-envoy
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 2
{
"args": {
"answer": "42"
},
"headers": {
"Accept": "*/*",
"Content-Length": "0",
"Host": "httpbin.org",
"User-Agent": "curl/7.58.0",
"X-Amzn-Trace-Id": "Root=1-5ee8d7a1-cb3954c09299eb9e0dff70a6",
"X-B3-Parentspanid": "dffc55451e64b5fc",
"X-B3-Sampled": "0",
"X-B3-Spanid": "8e233a863fb18b6c",
"X-B3-Traceid": "45bd12a9067fb5c0dffc55451e64b5fc",
"X-Envoy-External-Address": "10.100.91.201",
"X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=c1ff14671b3e24ee794f9a486570abf8ccc9d622846611d3f91a322db4d480cd;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
},
"origin": "69.84.111.39,10.100.91.201",
"url": "http://httpbin.org/get?answer=42"
}
위의 출력은 원시 HTTP 응답입니다. 응답 헤더는 날짜 :에서 x-envoy-upstream-service-time :까지의 행입니다.
파일 다운로드
Wget은 명령 줄을 통해 파일을 다운로드하는 일반적인 도구입니다. 대부분의 Linux 배포판에는 wget이 내장되어 있지만 눈에 띄게 OSX에는 wget이 제공되지 않습니다.
실제로 wget url은 curl -OL url과 같습니다. -O 옵션은 --remote-name 옵션이며 curl이 응답 본문을 로컬 파일에 저장하도록 지시합니다. -L 옵션은 curl에게 리디렉션을 따르도록 지시합니다.
예를 들어 아래는 Unsplash의 이미지이며 URL은 https://images.unsplash.com/photo-1506812574058-fc75fa93fead입니다.
curl을 사용하여 이 이미지를 다운로드하려면 다음을 실행하십시오.
$ curl -OL https://images.unsplash.com/photo-1506812574058-fc75fa93fead
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 12.1M 100 12.1M 0 0 3927k 0 0:00:03 0:00:03 --:--:-- 3927k
$
-O 옵션은 curl에서 마지막 / 이후의 모든 것을 파일 이름으로 사용하도록 지시합니다. 따라서 위의 예에서 이미지는 파일 이름이 photo-1506812574058-fc75fa93fead 인 현재 디렉토리에 저장됩니다. 파일 이름을 지정하려면 -o 옵션 (소문자 'o')을 사용하십시오.
$ curl -o miami-beach.jpg https://images.unsplash.com/photo-1506812574058-fc75fa93fead
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 12.1M 100 12.1M 0 0 6083k 0 0:00:02 0:00:02 --:--:-- 6083k
$ ls -l miami-beach-jpg
-rw-rw-r-- 1 val val 12788445 Jun 16 11:03 miami-beach.jpg
$
승인으로 요청하기
인증 헤더는 RESTful API와 대화 할 때 일반적으로 인증 자격 증명을 넣어야 하는 곳입니다. 권한 부여 헤더를 수동으로 설정하려면 사용자 정의 요청 헤더를 설정하는 -H 플래그를 사용해야 합니다. 예를 들어, API 키가 my-secret-token 인 경우 아래와 같이 curl HTTP 요청에 첨부 할 수 있습니다.
$ curl -H "Authorization: my-secret-token" https://httpbin.org/get
{
"args": {},
"headers": {
"Accept": "*/*",
"Authorization": "my-secret-token",
"Host": "httpbin.org",
"User-Agent": "curl/7.58.0",
"X-Amzn-Trace-Id": "Root=1-5ee8e1a5-a3aa30e0765a7980b04ca4a0"
},
"origin": "69.84.111.39",
"url": "https://httpbin.org/get"
}
$
httpbin.org/get은 headers 속성 아래의 응답 본문에서 HTTP 요청 헤더를 다시 보냅니다.
Curl은 또한 -u 플래그를 사용하여 기본 인증을 지원합니다. 예를 들어, 아래는 사용자 이름 사용자 및 비밀번호 전달로 요청을 보내는 방법입니다.
$ curl -i -u "user:pass" https://httpbin.org/basic-auth/user/pass
HTTP/2 200
date: Tue, 16 Jun 2020 15:18:45 GMT
content-type: application/json
content-length: 47
server: istio-envoy
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 1
{
"authenticated": true,
"user": "user"
}
$
잘못된 사용자 이름과 비밀번호를 보내면 어떻게 됩니까?
$ curl -i -u "user:wrongpass" https://httpbin.org/basic-auth/user/pass
HTTP/2 401
date: Tue, 16 Jun 2020 15:18:51 GMT
content-length: 0
server: istio-envoy
www-authenticate: Basic realm="Fake Realm"
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 12
$
JSON으로 POST 요청하기
-X 플래그는 curl에 PUT, POST 등 사용할 HTTP 메소드를 알려줍니다. 기본적으로 curl은 GET을 사용하므로 curl -X GET을 수행 할 필요가 없습니다.
-X 플래그는 종종 -d 플래그와 함께 사용되어 요청 본문을 설정할 수 있습니다. 다음은 일부 JSON으로 POST 요청을 보내는 방법입니다.
$ curl -X POST -d '{"answer":42}' https://httpbin.org/post
{
"args": {},
"data": "",
"files": {},
"form": {
"{\"answer\":42}": ""
},
"headers": {
"Accept": "*/*",
"Content-Length": "13",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/7.58.0",
"X-Amzn-Trace-Id": "Root=1-5ee8e3fd-8437029087be44707bd15320",
"X-B3-Parentspanid": "2a739cfc42d28236",
"X-B3-Sampled": "0",
"X-B3-Spanid": "8bdf030613bb9c8d",
"X-B3-Traceid": "75d84f317abad5232a739cfc42d28236",
"X-Envoy-External-Address": "10.100.91.201",
"X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=ea8c3d70befa0d73aa0f07fdb74ec4700d42a72889a04630741193548f1a7ae1;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
},
"json": null,
"origin": "69.84.111.39,10.100.91.201",
"url": "http://httpbin.org/post"
}
$
curl은 기본적으로 요청의 'Content-Type'헤더를 application / x-www-form-urlencoded로 설정합니다. JSON에는 올바르지 않으므로 JSON 요청의 경우 -H 플래그를 사용하여 'Content-Type'헤더도 설정해야 합니다.
$ curl -X POST -d '{"answer":42}' -H "Content-Type: application/json" https://httpbin.org/post
{
"args": {},
"data": "{\"answer\":42}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "13",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.58.0",
"X-Amzn-Trace-Id": "Root=1-5ee8e45e-ad875af4f83efd4379b86c34",
"X-B3-Parentspanid": "5f4f33d1c5ea13aa",
"X-B3-Sampled": "0",
"X-B3-Spanid": "a062c9bf2ebfd4bd",
"X-B3-Traceid": "44aa8d62412ae34d5f4f33d1c5ea13aa",
"X-Envoy-External-Address": "10.100.86.47",
"X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=2f0b3331fe4d512975b4b82583a55dd5d1196023d0dfce9e0abed246991c5b67;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
},
"json": {
"answer": 42
},
"origin": "69.84.111.39,10.100.86.47",
"url": "http://httpbin.org/post"
}
JSON 파일을 사용하여 PUT 요청 만들기
-d 플래그 자체는 작은 요청에 편리하지만 거대한 JSON 페이로드를 처리하기가 번거로울 수 있습니다. 고맙게도 -d 플래그는 로컬 파일에서 데이터를 가져 오는 것을 지원합니다.
예를 들어, 아래 내용이 있는 data.json 파일이 있다고 가정하십시오.
{"answer":42}
해당 파일을 요청 본문으로 하여 HTTP PUT 요청을 작성하려면 -d 플래그를 '@ data.json'으로 설정할 수 있습니다. @ 접두사는 curl에게 'data.json'파일에서 요청 본문을 로드 하도록 지시합니다.
$ curl -X PUT -d '@data.json' -H "Content-Type: application/json" https://httpbin.org/put
{
"args": {},
"data": "{\"answer\":42}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "13",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/7.58.0",
"X-Amzn-Trace-Id": "Root=1-5ee8e745-37c4ef06326b7b4354a16b94",
"X-B3-Parentspanid": "a4f8f91f4f1b051e",
"X-B3-Sampled": "0",
"X-B3-Spanid": "a018b1a3fcebdc68",
"X-B3-Traceid": "7b48b01dc3f632eea4f8f91f4f1b051e",
"X-Envoy-External-Address": "10.100.91.201",
"X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=6035260d9d551af6c1907270653214e8d3195abbdd19078c1c84fd9a4106f260;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
},
"json": {
"answer": 42
},
"origin": "69.84.111.39,10.100.91.201",
"url": "http://httpbin.org/put"
}
$
계속
요약하면, 가장 유용한 컬 옵션이 있습니다.
Curl은 사용자가 서명 한 API이든 로컬에서 개발 중인 것인지에 관계없이 명령 줄에서 API를 수정하는 데 유용한 도구입니다. 빠른 테스트를 위해 구문에 익숙하다면 Node.js에서 Axios 요청을 작성하거나 Postman에서 요청을 설정하는 것보다 Curl이 더 쉽습니다.
등록된 댓글이 없습니다.