/
curl ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ๋ฒ• - HTTP GET/POST, REST API ์—ฐ๊ณ„๋“ฑ

curl ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ๋ฒ• - HTTP GET/POST, REST API ์—ฐ๊ณ„๋“ฑ

์ด ํŽ˜์ด์ง€ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์•„์ ธ์„œ curl ์ฃผ์š” ์‚ฌ์šฉ๋ฒ• ์š”์•ฝ ์— ์ฃผ์š” ๋‚ด์šฉ๋งŒ ์ถ•์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. 

Web ์—์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์„ ๊ฒฝ์šฐ wget ์ด ๋” ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•ฉ๋‹ˆ๋‹ค.


๊ฐœ์š”

curl ์€ command line ์šฉ data transfer tool ์ด๋‹ค. download/upload ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋ฉฐ HTTP/HTTPS/FTP/LDAP/SCP/TELNET/SMTP/POP3 ๋“ฑ ์ฃผ์š”ํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜๋ฉฐ Linux/Unix ๊ณ„์—ด ๋ฐ Windows ๋“ฑ ์ฃผ์š”ํ•œ OS ์—์„œ ๊ตฌ๋™๋˜๋ฏ€๋กœ

์—ฌ๋Ÿฌ ํ”Œ๋žซํผ๊ณผ OS์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ libcurl ์ด๋ผ๋Š” C ๊ธฐ๋ฐ˜์˜ library ๊ฐ€ ์ œ๊ณต๋˜๋ฏ€๋กœ C/C++ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์‹œ ์œ„์˜ protocol ๊ณผ ์—ฐ๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด libcurl ์„ ์‚ฌ์šฉํ•˜์—ฌ ์†์‰ฝ๊ฒŒ ์—ฐ๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

libcurl์€ PHP, ruby, PERL ๋ฐ ์—ฌ๋Ÿฌ ์–ธ์–ด์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๋‚˜ ๊ฐœ๋ฐœํ™˜๊ฒฝ์— ๋งž๊ฒŒ libcurl ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
 

์„ค์น˜

Linux๋‚˜ Mac OS X ์—๋Š” ๊ธฐ๋ณธ ํƒ‘์žฌ๋˜์–ด ์žˆ๋‹ค. Windows๋Š” build ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด๋„ ๋˜๊ณ  compiler ๊ฐ€ ์žˆ๋‹ค๋ฉด ์†Œ์Šค๋ฅผ ๋ฐ›์•„์„œ ์ง์ ‘ ๋นŒ๋“œํ•ด๋„ ๋œ๋‹ค.(curl windows ์—์„œ ๋นŒ๋“œํ•˜๊ธฐ ์ฐธ์กฐ)

Windows ๋ฒ„์ „์€ cygwin๋‚˜ MinGW ๋กœ ๋นŒ๋“œํ•œ๊ฑฐ ๋ณด๋‹ค๋Š” VIsual Studio ๋กœ ๋นŒ๋“œํ•œ ๋ฒ„์ „์„ ๋‹ค์šด๋ฐ›๋Š”๊ฒŒ ์ข‹๋‹ค. (Win32-Generic, Win64 - Generic ํ•ญ๋ชฉ์—์„œ ๋ฐ›์œผ๋ฉด ๋˜๋ฉฐ ์ถ”์ฒœํ•˜๋Š” ๋งํฌ๋Š” https://winampplugins.co.uk/curl/ ์ด๋‹ค.) 

CentOS/RHEL ๊ณ„์—ด์—์„œ ์ตœ์‹  ๋ฒ„์ „ ์„ค์น˜๋Š” RHEL/CentOS 6 ์—์„œ curl ์ตœ์‹  ๋ฒ„์ „ ์„ค์น˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.


์ฃผ์š” ์˜ต์…˜

curl [options...] <url> ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

option ์ฒ˜๋ฆฌ๋Š” GNU getopt ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ•˜์ดํ”ˆ ํ•˜๋‚˜๋ฅผ ๋ถ™์ด๋Š” short ํ˜•์‹์˜ ์˜ต์…˜๊ณผ ํ•˜์ดํ”ˆ ๋‘๊ฐœ๋กœ ์‹œ์ž‘๋˜๋Š” long ํ˜•์‹์˜ options ์ด ์žˆ๋‹ค. 

์ฃผ์š” options (http/https ๊ด€๋ จ ์˜ต์…˜๋งŒ ์ •๋ฆฌ)

shortlong์„ค๋ช…๋น„๊ณ 
-k--insecurehttps ์‚ฌ์ดํŠธ๋ฅผ SSL certificate ๊ฒ€์ฆ์—†์ด ์—ฐ๊ฒฐํ•œ๋‹ค.wget ์˜ --no-check-certificate ๊ณผ ๋น„์Šทํ•œ ์—ญํ•  ์ˆ˜ํ–‰
-l--headHTTP 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--dataHTTP Post dataFORM ์„ POST ํ•˜๋Š” HTTP๋‚˜ JSON ์œผ๋กœ ๋ฐ์ดํƒ€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” REST ๊ธฐ๋ฐ˜์˜ ์›น์„œ๋น„์Šค ๋””๋ฒ„๊น…์‹œ ์œ ์šฉํ•œ ์˜ต์…˜์ด๋‹ค
-v--verbose ๋™์ž‘ํ•˜๋ฉด์„œ ์ž์„ธํ•œ ์˜ต์…˜์„ ์ถœ๋ ฅํ•œ๋‹ค.
-J--remote-header-name์–ด๋–ค ์›น์„œ๋น„์Šค๋Š” ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ์‹œ Content-Disposition Header ๋ฅผ ํŒŒ์‹ฑํ•ด์•ผ ์ •ํ™•ํ•œ ํŒŒ์ผ์ด๋ฆ„์„ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. -J ์˜ต์…˜์„ ์ฃผ๋ฉด ํ—ค๋”์— ์žˆ๋Š” ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•œ๋‹ค.curl 7.20 ์ด์ƒ๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ์˜ต์…˜
-o--output FILEcurl ์€ remote ์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํƒ€๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์ฝ˜์†”์— ์ถœ๋ ฅํ•œ๋‹ค. -o ์˜ต์…˜ ๋’ค์— FILE ์„ ์ ์–ด์ฃผ๋ฉด ํ•ด๋‹น FILE ๋กœ ์ €์žฅํ•œ๋‹ค. (download ์‹œ ์œ ์šฉ)
-O--remote-namefile ์ €์žฅ์‹œ 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 ๋„ ํฌํ•จํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค. (๋””๋ฒ„๊น…์— ์œ ์šฉ)

HTTP/HTTPS Download(GET Method)

HTTP๋กœ ๋‹ค์šด๋กœ๋“œ

๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํŒŒ์ผ์„ ์ฝ˜์†”๋กœ ์ถœ๋ ฅ
curl http://www.gnu.org/software/bash/manual/html_node/index.html
์ง€์ •ํ•œ ์ด๋ฆ„์œผ๋กœ ์ €์žฅ
curl -o index.html http://www.gnu.org/software/bash/manual/html_node/index.html
์„œ๋ฒ„์˜ filename ์œผ๋กœ ์ €์žฅ
curl -O  http://www.gnu.org/software/bash/manual/html_node/index.html
์—ฌ๋Ÿฌ url ์—์„œ ๋™์‹œ์— ๋‹ค์šด๋กœ๋“œ
curl -O  http://www.gnu.org/software/bash/manual/html_node/index.html -O http://www.gnu.org/savannah-checkouts/gnu/libiconv/documentation/libiconv-1.13/iconv.1.html

์ด์–ด๋ฐ›๊ธฐ

-C/--continue-at  <offset> ์˜ต์…˜์„ ์ฃผ๋ฉด ์ด์–ด๋ฐ›๊ธฐ ๊ฐ€๋Šฅ(offset ์— - ๋ฅผ ์ฃผ๋ฉด ์ „์†ก์ดํ›„ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ด์–ด๋ฐ›์Œ)

์ด์–ด ๋ฐ›๊ธฐ
curl -C - -O  http://www.gnu.org/software/bash/manual/html_node/index.html

ํŠน์ •์ผ ์ด์ „/์ดํ›„ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉด ๋ฐ›๊ธฐ

 -z/--time-cond <time>

HTTP ํ—ค๋”์— If-Modified-Since: ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํŠน์ •์ผ ์ดํ›„์— ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉด ๋‹ค์šด๋กœ๋“œ ์ˆ˜ํ–‰

์•„๋ž˜ ์˜ˆ์ œ๋Š” 2011๋…„ 12์›” 21์ผ ์ดํ›„์— ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉด ๋‹ค์šด๋กœ๋“œ ์ˆ˜ํ–‰

curl -z 21-Dec-11 http://www.example.com/yy.html

๋‚ ์ž์•ž์— - ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด If-Unmodified-Since: ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํŠน์ •์ผ ์ด์ „์— ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉด ๋‹ค์šด๋กœ๋“œ ์ˆ˜ํ–‰

์•„๋ž˜ ์˜ˆ์ œ๋Š” 2011๋…„ 12์›” 21์ผ ์ด์ „์— ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉด ๋‹ค์šด๋กœ๋“œํ•จ (๋‚ ์ž์— - ์ถ”๊ฐ€)

curl -z -21-Dec-11 http://www.example.com/yy.html

http ์‘๋‹ต ์ฝ”๋“œ๋งŒ ์ถœ๋ ฅ

HTTP Header ๋‚˜ contents ๋Š” ๋นผ๊ณ  HTTP Response code ๋งŒ ์ถœ๋ ฅํ•œ๋‹ค. ์„œ๋ฒ„์˜ ์ •์ƒ ์ž‘๋™ ์—ฌ๋ถ€ ์ ๊ฒ€๋•Œ ์œ ์šฉํ•˜๋‹ค.

curl -L -k -s -o /dev/null -w "%{http_code}\n" http://www.example.com/yy.html

์„œ๋ฒ„์˜ ์ •์ƒ ๋™์ž‘ ์—ฌ๋ถ€๋ฅผ ์ ๊ฒ€ํ•  ๊ฒฝ์šฐ SSL ์ธ์ฆ์„œ ๊ฒ€์ฆ ์ œ์™ธ(-k) ์™€ 301, 302 Redirect ์‹œ ๋”ฐ๋ผ ๊ฐ€๋Š” ์˜ต์…˜(-L)์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.


์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ๋กœ ์›น ์„œ๋ฒ„์˜ ์ •์ƒ ๋™์ž‘ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 Click here to expand...


๊ฒฐ๊ณผ๊ฐ’์— HTTP Header ํฌํ•จ(-i)

-i ,–include ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„์˜ ์‘๋‹ต์— ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ HTTP ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค. ๋””๋ฒ„๊น…์— ์œ ์šฉํ•œ๋‹ค.

curl -i https://api.github.com -u valid_username:valid_password


jq ์™€ ์—ฐ๋™ํ•ด์„œ ์„œ๋ฒ„์˜ JSON ํŒŒ์‹ฑ

๋ช…๋ นํ–‰ json ์ฒ˜๋ฆฌ๊ธฐ์ธ jq ๋ฅผ ์—ฐ๋™ํ•ด์„œ ์„œ๋ฒ„์˜ JSON ์‘๋‹ต์„ ๋ณด๊ธฐ ์ข‹๊ฒŒ ํŒŒ์‹ฑ

jq ์™€ ์—ฐ๋™
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq .


๋ฐฐ์—ด๋กœ ๋„˜์–ด์˜จ ์‘๋‹ต์ค‘ ์ฒซ ๋ฒˆ์งธ ์›์†Œ ์ถ”์ถœ

jq ์™€ ์—ฐ๋™
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.[1]'

HTTP ์ธ์ฆ

Basic Auth

id/pwd ๊ฐ€ ํ•„์š”ํ•œ ์‚ฌ์ดํŠธ์˜ ๊ฒฝ์šฐ -u(–user) ์˜ต์…˜ ๋’ค์— userid:password ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

curl -v -u userid:password http://www.example.com/user.html

Bearer token ์ธ์ฆ

OAuth ๋‚˜ JWT ๋“ฑ์— ์‚ฌ์šฉํ•˜๋Š” Bearer token ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด -H ์˜ต์…˜๋’ค์—  'Authorization: Bearer {TOKEN}' ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉฐ {TOKEN} ์€ ์‹ค์ œ ํ† ํฐ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.

์•„๋ž˜๋Š” 12345 ๋ผ๋Š” token ์— ์„œ๋ฒ„์— ์ „์†กํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

curl -v -L  -X POST -H 'Accept: application/json' -H 'Authorization: Bearer 12345' 'https://www..example.com/api/myresource'

POST/File Upload(POST, PUT)

File Upload(PUT)

-T, --upload-file ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„์— ํŒŒ์ผ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์Œ. ์•„๋ž˜๋Š” a.pdf ๋ฅผ ์„œ๋ฒ„์— ์ „์†กํ•˜๋Š” ์˜ˆ์ œ

curl -T a.pdf http://posttestserver.com/post.php

-T ๋กœ ํŒŒ์ผ์„ ์ „์†กํ•˜๋ฉด POST ๊ฐ€ ์•„๋‹Œ PUT Request ๋กœ ์ฒ˜๋ฆฌํ•จ.


์ง์ ‘ PUT ์œผ๋กœ method ๋ฅผ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ  -X PUT ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ URL ์„ ํ˜ธ์ถœ.

curl -L -X PUT 'https://postman-echo.com/put' \
--data-raw 'This is expected to be sent back as part of response body.'


HTTP FORM POST 

-X POST ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ -d( --data) ์˜ต์…˜์„ ์ง€์ •ํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ POST ๋กœ ์„ค์ •๋จ

FORM ํŒŒ์ผ
<form method="POST" action="post.php">
    <input type=text name="first_name">
    <input type=text name="last_name">
    <input type=submit name=press value=" OK ">
 </form>

POST ๋ฐ์ดํƒ€๋Š” "param1=value1&param2=value2" ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ

curl -d "first_name=Bruce&last_name=Wayne&press=%20OK%20" http://posttestserver.com/post.php


๋ฐ์ดํƒ€์— ๊ณต๋ฐฑ์ด๋‚˜ ๊ธฐํƒ€ ํŠน์ˆ˜ ๋ฌธ์ž๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ URL encoding ์„ ํ•ด์•ผ ํ•œ๋‹ค.

๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ ์ผ์ผ์ด + ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ „์†กํ•ด์•ผ ํ•˜์ง€๋งŒ ์ตœ์‹  ๋ฒ„์ „์˜ curl(7.18.0 ์ดํ›„) ์€ FORM ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ URL Encoding ํ•ด์ฃผ๋Š” --data-urlencode ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ„๋„๋กœ ์ธ์ฝ”๋”ฉ์„ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

curl --data-urlencode "first_name=Bruce" --data-urlencode "last_name=Wayne" --data-urlencode "press= OK " http://posttestserver.com/post.php

Hidden field ์ „์†ก์‹œ ์ผ๋ฐ˜ ํ•„๋“œ์ฒ˜๋Ÿผ name=value ํ˜•์‹์œผ๋กœ ์ „์†กํ•˜๋ฉด ๋œ๋‹ค.

HTTP POST data

-d, --data ์˜ต์…˜๋’ค์— ์ „์†กํ•  ๋ฐ์ดํƒ€๋ฅผ ๊ธฐ์ˆ 

curl -L -v -d '{"name": "superman", "age" : 30}' -H "Accept: application/json" -H "Content-Type: application/json" http://posttestserver.com/post.php

-d ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด -X POST ๋Š” ์ œ์™ธ ๊ฐ€๋Šฅ


HTTP POST File

file์„ POSTํ•  ๊ฒฝ์šฐ file name ์•ž์— @ ๋ฅผ ๋ถ™์—ฌ์คŒ 

curl -d @myPostfile http://posttestserver.com/post.php

HTTP POST Binary File

curl ์€ POST ์‹œ ๋ฐ์ดํƒ€๋ฅผ text ๋กœ ์ทจ๊ธ‰ํ•˜๋ฏ€๋กœ binary ๋ฐ์ดํƒ€๋Š” ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ œ๋Œ€๋กœ ์ „์†กํ•˜๋ ค๋ฉด --data-binary ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

curl --data-binary @myBinary.jpg http://posttestserver.com/post.php

HTTP File Upload Form

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ ์—…๋กœ๋“œ FORM ์ด ์žˆ์„๋•Œ

<form method="POST" enctype='multipart/form-data' action="upload.php">
 <input type=file name=upload>
 <input type=submit name=press value="OK">
</form>

localfilename ์€ upload ํ•  ํŒŒ์ผ๋ช…, submit ์€ press=OK

curl --form upload=@localfilename --form press=OK http://localhost/upload.php

PATCH, DELETE ๋ฉ”์„œ๋“œ

PATCH

Remote ์— ์žˆ๋Š” Resource ์˜ ์ „์ฒด๋ฅผ ๊ต์ฒดํ•˜๋Š” PUT ๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ผ๋ถ€ ํ•ญ๋ชฉ๋งŒ ๊ต์ฒดํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ -X PATCH ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ URL ํ˜ธ์ถœ.

curl -L -X PATCH 'https://postman-echo.com/patch' \
--data-raw 'This is expected to be sent back as part of response body.'

DELETE

Remote ์— ์žˆ๋Š” Resource ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์„œ๋ฒ„๋Š” ๊ถŒํ•œ์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ ํ˜ธ์ถœ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ.

client ๋Š” -X DELETE ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ URL ํ˜ธ์ถœ.

curl -L -X DELETE 'https://postman-echo.com/delete' \
--data-raw 'This is expected to be sent back as part of response body.'

HTTP Header ์„ค์ •

ํŠน์ •ํ•œ HTTP Header ๋ฅผ ์„ค์ •ํ•ด์„œ ๋ณด๋‚ด์•ผ ํ•  ๊ฒฝ์šฐ(Ex: json data๋“ฑ) -H (–header) ์˜ต์…˜์œผ๋กœ ํ—ค๋”๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

Content-Type Header ์„ค์ •

curl -d @myJson.js -H "Content-Type: application/json" http://localhost:8080/jsonEcho

User-Agent ์„ค์ •

ํŠน์ • ๋ธŒ๋ผ์šฐ์ €์ธ(Browser) ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” -A ( --user-agent) ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (http://www.useragentstring.com/)


User-Agent Chrome 24.0

Chrome 24.0 ์œผ๋กœ User-Agent ์„ค์ •
curl -d @myJson.js -H "Content-Type: application/json" --user-agent "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 Safari/537.14" http://localhost:8080/jsonEcho


User-Agent MSIE(Internet Explorer) 10.0

IE 10.0
curl -d @myJson.js -H "Content-Type: application/json" --user-agent "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)" http://localhost:8080/jsonEcho


User-Agent Firefox 29.0

Firefox 29.0
curl -d @myJson.js -H "Content-Type: application/json" --user-agent "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0" http://localhost:8080/jsonEcho

Referer ์„ค์ •

Referer ๋ฅผ ์ฒดํฌํ•˜๋Š” ์‚ฌ์ดํŠธ์ผ ๊ฒฝ์šฐ -e (–referer) ์˜ต์…˜์œผ๋กœ Referer URL ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

curl --referer http://www.example.come/from  http://www.example.com/to

์•„๋‹ˆ๋ฉด -H ์˜ต์…˜์œผ๋กœ referer ํ—ค๋”๋ฅผ ์ง€์ •ํ•ด๋„ ๋œ๋‹ค.

curl -H "Referer: http://www.example.come/from"  http://www.example.com/to

Accept-Encoding  ์œผ๋กœ ์ปจํ…์ธ  ์••์ถ• ์š”์ฒญ

์ „์†ก ์†๋„ ํ–ฅ์ƒ์„ ์œ„ํ•ด mod_deflate(apache httpd) ๋‚˜ ngx_http_gzip_module ์„ ์‚ฌ์šฉํ•ด์„œ ์ปจํ…์ธ ๋ฅผ ์••์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค. ์›น ์„œ๋ฒ„๊ฐ€ ์ปจํ…์ธ  ์••์ถ•์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด curl ์‹คํ–‰์‹œ Accept-Encoding ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

curl -I -H 'Accept-Encoding: gzip,deflate' https://www.google.com


HTTP/1.1 200 OK
Date: Wed, 25 Jul 2018 08:29:02 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Content-Encoding: gzip
Server: gws

์••์ถ• ์—ฌ๋ถ€๋Š” Content-Encoding: gzip ํ—ค๋”๊ฐ€ ์„œ๋ฒ„ response ์— ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

SSL/TLS ์˜ต์…˜

SSL/TLS ์ธ์ฆ์„œ ๊ฒ€์ฆ ์„ค์ •

curl์€ TLS ์—ฐ๊ฒฐ์‹œ ์ธ์ฆ์„œ์˜ ์œ ํšจ์„ฑ(์‹ ๋ขฐ๋œ ์ธ์ฆ๊ธฐ๊ด€์—์„œ ๋ฐœ๊ธ‰ ์—ฌ๋ถ€, ์ธ์ฆ์„œ๋‚ด DN๊ณผ host์ด๋ฆ„  ์ผ์น˜ ์—ฌ๋ถ€, ์œ ํšจ ๊ธฐ๊ฐ„๋‚ด์— ์žˆ๋Š”์ง€๋“ฑ)์„ ๊ฒ€์ฆํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์šฉ ์„œ๋ฒ„๋ผ ๋„๋ฉ”์ธ์ด ์—†์–ด์„œ self signed ์ธ์ฆ์„œ๊ฐ€ ์„ค์น˜๋˜์—ˆ๊ฑฐ๋‚˜
์œ ํšจ ๊ธฐ๊ฐ„์ด ์ง€๋‚ฌ๋Š”๋ฐ ๊ฐฑ์‹ ์„ ๋ชป ํ–ˆ๊ฑฐ๋‚˜ ๋“ฑ์˜ ์ด์œ ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์š”์ฒญ์ด ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค.


์ด๋Ÿฐ ๊ฒฝ์šฐ -k, --insecure ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์ฆ์„œ ๊ฒ€์ฆ์„ ๋„๊ณ  TLS ์„ธ์…˜์„ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

curl -k -L http://www.example.come

์ผ๋ฐ˜์ ์œผ๋กœ -k ๋Š” -L ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๋‹ค.


curl ์— ์ธ์ฆ ๊ธฐ๊ด€ ์ธ์ฆ์„œ๊ฐ€ ๋“ฑ๋ก๋˜์ง€ ์•Š์•„์„œ ๊ฒ€์ฆ ์˜ค๋ฅ˜๊ฐ€ ๋‚  ๊ฒฝ์šฐ curl ์— ์‹ ๋ขฐํ•˜๋Š” ์ธ์ฆ๊ธฐ๊ด€ ์ธ์ฆ์„œ(CA Cert) ์ถ”๊ฐ€ํ•˜๊ธฐ ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ธ์ฆ์„œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

libcurl ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ -k ์˜ต์…˜์€ ๋‹ค์Œ 2๊ฐ€์ง€ ์˜ต์…˜์„ ํ˜ธ์ถœํ•œ ๊ฒƒ๊ณผ ๋™์ผ(https://github.com/lesstif/php-jira-rest-client/blob/master/src/JiraClient.php#L206-L207) ์ฐธ๊ณ 

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);


TLS Version ์ง€์ •

์ฟ ํ‚ค๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅ

ํŒŒ์ผ๋กœ ์ €์žฅํ•  ๊ฒฝ์šฐ -c, --cookie-jar ์˜ต์…˜๋’ค์— ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•  ํŒŒ์ผ๋ช…์„ ์ ์–ด์คŒ.

์•„๋ž˜ ์˜ˆ์ œ๋Š” cookiejar.txt ํŒŒ์ผ์— cookie ๋ฅผ ๊ธฐ๋ก

curl -v -I  -c cookiejar.txt https://www.example.com


ํŒŒ์ผ ๋˜๋Š” ๋ฌธ์ž์—ด์—์„œ ์ฟ ํ‚ค ์ฝ๊ธฐ

 -b, --cookie ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•œ ํŒŒ์ผ์—์„œ ์ฝ๊ฑฐ๋‚˜ ๋˜๋Š” ์ง์ ‘ ์ฟ ํ‚ค ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ HTTP ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Œ.


curl -v -I  -b cookiejar.txt https://www.example.com


์ฟ ํ‚ค ๊ฐ’ ์„ค์ •ํ•ด์„œ ์ „์†ก

tomcat ์ด ์‚ฌ์šฉํ•˜๋Š” ์„ธ์…˜ ์ฟ ํ‚ค์ธ JSESSIONID ๋ฅผ ์„ค์ •ํ•ด์„œ ์„œ๋ฒ„์— ์š”์ฒญ

curl -v -I  -b "JSESSIONID=8A39E226F2B6D4DC32CE0E8D" https://www.example.com

์ƒˆ๋กœ ์„ธ์…˜ ์ฟ ํ‚ค ์ƒ์„ฑ

-b ์˜ต์…˜๊ณผ ํ•จ๊ป˜  -j, --junk-session-cookies ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•œ ํŒŒ์ผ์—์„œ ์„ธ์…˜ ์ •๋ณด๋งŒ ์ฝ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒˆ๋กœ ์„ธ์…˜ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ.

curl -v -I  -b cookiejar.txt -j https://www.example.com


REST API ์™€ ์—ฐ๊ณ„

์œ„์˜ ์˜ต์…˜๋“ค์ด ์ต์ˆ™ํ•ด์กŒ์œผ๋ฉด REST ๊ธฐ๋ฐ˜์˜ ์›น์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ curl ์„ ์ด์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ๋ฐ ๋””๋ฒ„๊น…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. REST API ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์œ ๋ช…ํ•œ Web App ์™€ ์—ฐ๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด ๋ณธ๋‹ค.

curl๋กœ Atlassian JIRA REST API ์—ฐ๊ณ„ํ•˜๊ธฐ


Sonatype nexus Admin API

๊ด€๋ฆฌ์ž ์•”ํ˜ธ ๋ณ€๊ฒฝ

curl -v -k -d "{"data":{"userId":"admin","oldPassword":"admin123","newPassword":"admin1234"}}" -u admin:admin123 https://my-nexus-site/nexus/service/local/users_changepw



See Also

Ref

Related content

curl ๋กœ command line ์—์„œ HTTP ์š”์ฒญํ•˜๊ธฐ
curl ๋กœ command line ์—์„œ HTTP ์š”์ฒญํ•˜๊ธฐ
More like this
curl ์ฃผ์š” ์‚ฌ์šฉ๋ฒ• ์š”์•ฝ
curl ์ฃผ์š” ์‚ฌ์šฉ๋ฒ• ์š”์•ฝ
More like this
RHEL/CentOS 6 ์—์„œ curl ์ตœ์‹  ๋ฒ„์ „ ์„ค์น˜
RHEL/CentOS 6 ์—์„œ curl ์ตœ์‹  ๋ฒ„์ „ ์„ค์น˜
More like this
linux command line ์—์„œ HTTP ๋กœ ํŒŒ์ผ ๋ฐ›๊ธฐ - wget ์‚ฌ์šฉ๋ฒ•
linux command line ์—์„œ HTTP ๋กœ ํŒŒ์ผ ๋ฐ›๊ธฐ - wget ์‚ฌ์šฉ๋ฒ•
More like this
Command line HTTP Client util
Command line HTTP Client util
More like this
httpie - curl ์„ ๋Œ€์ฒดํ•  http client ์œ ํ‹ธ๋ฆฌํ‹ฐ
httpie - curl ์„ ๋Œ€์ฒดํ•  http client ์œ ํ‹ธ๋ฆฌํ‹ฐ
More like this