Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

curl 7.82.0에 추가된 JSON 옵션

1998년에 만들어진 curlDaniel Stenberg이 만든 URL로 요청을 보내고 받을 수 있는 명령행 도구이다. 물론 너무 유명한 도구이므로 이렇게 따로 설명할 필요도 없다. 보통 HTTP/HTTPS 요청을 테스트해 볼 때 많이 사용하는데 요즘은 Postman이나 Insomnia같은 편리한 도구들도 많지만, 터미널에서 쓰기엔 curl만 한 것도 없다.

curl의 GitHub 저장소 컨트리뷰션 그래프

사실 curl이 달라진다고 느끼기 어렵긴 한데 curl은 20년 넘게 꾸준하게 개발되고 유지 보수되고 있다.

최근 7.82.0 Impartial Content 버전이 릴리스 되면서 JSON 옵션 기능이 추가되었다.

그래서 바로 curl을 업그레이드했다. 기존에는 macOS에서 7.77.0가 설치되어 있었는데 Homebrew를 이용해서 curl을 업그레이드했다. 기존 curl은 원래 설치되어 있던 것이므로 먼저 brew install curl로 새로 설치하고 안내에 echo 'export PATH="/opt/homebrew/opt/curl/bin:$PATH"' >> ~/.zshrc라고 나온 것처럼 경로에서 Homebrew로 설치한 curl이 사용되도록 설정했다. 아니면 /usr/bin/curl이 사용되어 OS에 설치된 버전이 사용된다.

$ curl --version
curl 7.82.0 (aarch64-apple-darwin21.3.0) libcurl/7.82.0 (SecureTransport) OpenSSL/1.1.1m zlib/1.2.11 brotli/1.0.9 zstd/1.5.2 libidn2/2.3.2 libssh2/1.10.0 nghttp2/1.47.0 librtmp/2.3 OpenLDAP/2.6.1
Release-Date: 2022-03-05
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL TLS-SRP UnixSockets zstd


--json 옵션

기존에 POST로 JSON 페이로드를 담아서 요청을 보내려면 아래처럼 --data/-d 옵션을 사용해서 JSON 페이로드를 보내야 하지만 제대로 동작하려면 당연히 JSON을 요청을 위한 헤더도 지정해야 해서 귀찮은 부분이 있었다. 여기서 데모로 만든 HTTP 서버는 요청의 echo에 담긴 내용을 응답으로 돌려준다.

$ curl -X POST http://localhost:3000/demo \
  -H "Content-Type: application/json" \
  -d '{"echo":"Hello World"}'
Hello World

7.82.0부터는 --json 옵션이 추가되어 훨씬 간단하게 JSON 요청을 보낼 수 있게 되었다.

$ curl -X POST http://localhost:3000/demo \
  --json '{"echo":"Hi"}'
Hi

--json은 다음 세 옵션의 단축 옵션이다.

--data [arg]
--header "Content-Type: application/json"
--header "Accept: application/json"

--json을 여러 번 사용하면 데이터를 연결해 주므로 아래처럼 끊어서 여러 번 사용하는 것도 가능하다.

$ curl -X POST http://localhost:3000/demo \
  --json '{"echo": "curl is' --json ' awesome"}'
curl is awesome

--json 옵션과 함께 @ 문자를 사용하면 파일에서 요청을 읽어서 보낼 수도 있다.

$ cat file.json
{"echo":"from File"}

$ curl -X POST http://localhost:3000/demo \
  --json @file.json
from File

@- 형태로 사용하면 파일 대신 stdin으로 읽어 들일 수 있으므로 터미널에서 다른 명령행 프로그램과 함께 사용하는 것도 가능하다.

$ curl -X POST http://localhost:3000/demo \
  --json @- < file.json
from File
2022/03/09 17:44 2022/03/09 17:44