셸에서 HTTP 요청 보내기
curl은 URL로 요청을 보내고 응답을 출력하는 범용 클라이언트야. curl https://example.com은 응답 본문을 stdout에 쓰므로 파일 저장, 파이프, 상태 검사 가운데 무엇을 원하는지 옵션으로 분명히 정해야 해.
자주 쓰는 플래그
-L: 리디렉션을 따라가.-sS: 진행 표시는 숨기되 오류는 보여 줘.-o file: 지정한 파일에 쓰고,-O는 URL의 파일명을 사용해.-X POST와-X PUT: 요청 메서드를 정해.-H 'Header: Value': 헤더를 추가해.-d 'data': 요청 본문을 보내.--data-urlencode 'key=value with spaces': 값을 URL 인코딩해.--data @body.json: 파일에서 본문을 읽어.-u user:pass: 기본 인증 정보를 보내.-i와-I: 각각 응답 헤더 포함, 헤더만 출력을 뜻해.-w '%{http_code}\n': 상태 코드나 걸린 시간을 별도로 출력해.
JSON 본문을 POST하기
curl -sS https://api.example.com/items \
-H 'Authorization: Bearer ${TOKEN}' \
-H 'Content-Type: application/json' \
-d '{"name":"sample","qty":3}'인증한 GET 응답을 jq로 읽기
curl -sS -H 'Authorization: token ghp_xxx' \
https://api.github.com/user/repos | jq '.[].name'큰 파일을 진행률과 함께 받기
curl -L -o ubuntu.iso --progress-bar https://...상태 코드와 시간을 확인하기
curl -sS -o /dev/null -w '%{http_code} %{time_total}s\n' https://api네트워크 연결 성공만으로 애플리케이션 요청이 성공한 것은 아니야. 상태 코드와 응답 본문을 함께 확인해.
받은 스크립트를 바로 실행하지 마
curl --fail-with-body --connect-timeout 5 --max-time 30 \
-o installer.sh https://example.com/install.sh
less installer.shcurl ... | bash는 서버가 보내는 내용을 곧바로 실행해. 파일로 받은 뒤 출처와 체크섬, 내용을 확인하고 실행 여부를 결정해.
HTTP 성공에는 여러 층이 있어
curl은 기본적으로 404나 500 응답도 본문과 함께 반환할 수 있어. 지원되는 버전에서는 --fail-with-body로 HTTP 오류를 실패 상태로 만들고, 연결 제한 시간과 전체 제한 시간을 정해. 리디렉션과 응답 데이터도 작업 계약에 맞는지 확인해야 해.
재시도 전에 멱등성을 확인해
GET은 다시 시도하기 쉬운 경우가 많지만 결제나 생성 POST는 중복 부수 효과를 만들 수 있어. 재시도 횟수와 지연을 제한하고, 변경 요청에는 멱등성 키나 서비스가 제공하는 복구 계약을 사용해.