web

curl을 사용한 간단한 HTTP 통신

hjk927 2023. 9. 9. 16:35

 

오늘 curl에 대해서 포스팅을 하려고 했는데, 확인해보니까 작년에 내가 이미 올린 글이 있었다. 

그래도 그 포스팅은 간략하게 정리한 글이었어서 새로 정리하는 것도 의미가 있을 것 같다. 

.

1. curl 이란?


curl은 커맨드 라인에서 URL을 사용해서 데이터를 송수신할 수 있게 해주는 오픈소스 소프트웨어 및 라이브러리다. MIT 라이센스를 따르고 있다. 우리가 curl을 쓸 때 흔히 사용하는 HTTP뿐만 아니라 FTP, IMAP, POP3, SMTP 등 수많은 프로토콜을 지원한다. 

 

내가 curl을 처음으로 사용하게 된 계기는 리눅스 쉘에서 내가 개발한 자바 웹 애플리케이션의 restAPI를 실행하기 위해서였다. 원래는 포스트맨을 사용해서 내가 개발한 restAPI를 테스트했는데, 그때는 리눅스 서버에서 방화벽이 안 열려있어서 윈도우에 설치된 포스트맨으로 설치가 불가능했다. 그래서 명령줄로 restAPI를 호출하는 방법을 찾다가 curl을 알게 되었다. 

 

앞서 말했듯이 curl은 수많은 프로토콜을 지원하는데, 나는 HTTP 외에는 사용해본 게 없어서 이번 포스팅에서도 HTTP에 관해서만 설명할 예정이다. 

 

 

2. curl 사용하기 


리눅스는 물론 윈도우에서도 curl을 사용할 수 있다. 내가 설치한 기억은 없으니, 윈도우에 기본적으로 내장되어있는 모양이다. 

curl --help http 를 입력하면 http 통신에 사용할 수 있는 옵션 목록을 볼 수 있다. 

실제로 요청을 할 때는 curl [options...] <url> 형식으로 입력한다. 

 

설명을 위해서 사용자 정보를 저장하는 정말 간단한 목업 rest API를 설계했다. 사실 정말 만들기도 했는데... 포스팅을 쓰다 보니 크게 사용할 일은 없었다. 

 

* API 명세 

URL METHOD 역할
/people/list GET 사용자 목록 불러오기 
/people/insert POST 사용자 추가 
/people/update PUT 사용자 정보 변경
/people/delete DELETE 사용자 삭제 

* 사용자 데이터 명세 

필드명 desc type
name 이름 String
age 나이 int
job 직업 String

 

* Method별 요청 방법 

* GET 요청 

기본적으로 아래처럼 아무 옵션을 안 주고 url만 주면 GET 요청으로 취급된다. 

curl http://127.0.0.1/8080/people/list
curl http://127.0.0.1/8080/people/list?order=desc

 

* POST 요청 

-d 또는 --data 옵션을 붙이면 POST 요청으로 취급된다. 줄바꿈은 가독성을 위해 임의로 추가하고 \ 기호를 붙였다. 

curl --data "[{ \"name\":\"John\", \"age\":32, \"job\":\"programmer\" }]" \
http://127.0.0.1:8080/people/insert

내 환경에서는 헤더 Content-Type 기본값이 'application/x-www-form-urlencoded;charset=UTF-8' 으로 설정되는데, 헤더를 따로 지정해줘야 한다면 --header 옵션을 추가하면 된다. 

curl --data "[{ \"name\":\"John\", \"age\":32, \"job\":\"programmer\" }]" \
--header "Content-Type: application/json" \
http://127.0.0.1:8080/people/insert

 

 

* 기타 요청 

-X 또는 --request 옵션을 사용해서 메서드를 지정할 수 있다. 

curl -X PUT "[{ \"name\":\"John\", \"age\":32, \"job\":\"project manager\" }]" \
--header "Content-Type: application/json" \
http://127.0.0.1:8080/people/update

curl -X DELETE "[{ \"name\":\"John\" }]" \
--header "Content-Type: application/json" \
http://127.0.0.1:8080/people/delete

GET이나 POST도 위처럼 지정해줄 수 있다. 개인적으로는 -X를 붙여서 메서드를 명시해주는 게 보기에 편한 것 같다. 

 

 

3. curl 요청 옵션


3.1. 주로 사용하는 옵션 

사실 주로 사용하는 옵션은 위에 나온 게 다다. 간단하다. 한 번 더 보기좋게 정리하면 아래와 같다. 

옵션 축약형 설명
--data -d HTTP POST 요청을 할 때 보내는 body 데이터 

필요에 따라 --data-ascii, --data-binary, --data-raw, --data-urlencode 같은 세부 옵션으로 변경해서 사용할 수 있다. 
--header -H HTTP 요청 헤더
--request -X HTTP 요청 메서드 

 

3.2. 추가로 사용할 수 있는 옵션 

* --verbose

-v 또는 --verbose 옵션을 추가하면(-V와는 다르다) 좀 더 상세한 결과를 볼 수 있다. 

response 응답코드나 헤더같은 정보를 추가적으로 확인할 수 있다. 

헤더의 경우 -I 또는 --head를 입력하면 바디 없이 헤더 정보만 얻을 수 있다.  

 

 

* --form

-F 또는 --form 옵션으로 multipart MIME 데이터를 보낼 수 있다. 

일반적으로 form 데이터를 보낼 때는 특별히 옵션을 지정해줄 필요가 없다. 

 

아래처럼 form이 있다고 가정하자. 

<form method="GET 또는 POST" action="person/insert">
      <input type="text" name="name"/>
      <input type="text" name="age"/>
      <input type="text" name="job"/>
      <input type="submit" value="제출"/>
</form>

GET이나 POST로 데이터를 보낼 땐 이렇게 보낸다. 사실 나도 아직 해보진 않았는데 매뉴얼 상으로는 그렇다고 한다. 

# GET 
curl "http://127.0.0.1:8080/people/insert?name=MARI&age=25&job=engineer"

# POST
curl --data "name=MARI&age=25&job=engineer" http://127.0.0.1:8080/people/insert

 

form으로 파일을 보내야 할 때가 있는데, 그럴 때는 아래처럼 한다. 

<form method="POST" enctype='multipart/form-data' action="file/upload">
      <input type="file" name="filename"/>
      <input type="submit" name="press" value="OK"/>
</form>
curl --form 'filename=@"/C:/filedir/file.txt"' --form press=OK http://someurl:8080/file/upload

 

 

* --upload-file 

curl을 사용해서 PUT으로 파일을 업로드할 때는 --upload-file을 사용할 수 있다. 

curl --upload-file uploadfile http://IP:8080/file/upload

 

4. 여담 


작년보다는 curl을 잘 알게 되었다고 생각해서 정리를 시작했는데, 막상 포스팅을 하려고 찾아보니 아직 내가 모르는 옵션이나 기능이 훨씬 많았다. 

지금보다 더 잘 알게 되는 날이 오면 한 번 더 정리하고 싶을 것 같아서 포스팅 제목에 '간단한'을 붙였다. 

 

curl 공식 홈페이지에는 최신 소스를 볼 수 있는 깃헙 링크가 있는데, 최근 11시간 전까지도 커밋 이력이 있어서 신기하다는 생각을 했다. 여력이 된다면 깃헙을 보는 것도 재미있을 것 같다. 

 

 

 

5. 참고자료 


https://curl.se/docs/httpscripting.html

 

curl - The Art Of Scripting HTTP Requests Using Curl

The Art Of Scripting HTTP Requests Using Curl Background This document assumes that you are familiar with HTML and general networking. The increasing amount of applications moving to the web has made "HTTP Scripting" more frequently requested and wanted. T

curl.se

https://antonz.org/mastering-curl/#command-line-options

 

Mastering curl: interactive text guide

Text version with interactive examples.

antonz.org

https://ko.wikipedia.org/wiki/CURL

 

cURL - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org