프로그래밍

cURL 로 POST 요청 JSON 데이터 전송하기

ohlee52 2023. 9. 25. 00:00
반응형

cURL 로 POST 요청 JSON 데이터 전송하기
cURL 로 POST 요청 JSON 데이터 전송하기

cURL 이란?

cURL 은 다양한 프로토콜을 이용해 데이터를 전송을 위한 커맨드 라인 클라이언트 툴이다. 

맥, linux 계열 PC 에는 이미 설치가 되어 있다. windows에서는 설치가 필요하다.

맥 기준 터미널 (windows에서는 cmd)에서 curl --version  명령어를 입력해 설치가 되어있는지 확인 가능하다.

# 설치 버전을 확인 할 수 있다.
$ curl --version
curl 8.1.2 (x86_64-apple-darwin22.0) libcurl/8.1.2 (SecureTransport) LibreSSL/3.3.6 zlib/1.2.11 nghttp2/1.51.0
Release-Date: 2023-05-30
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS GSS-API HSTS HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL threadsafe UnixSockets

 

설치가 되어 있다면 가장 기본적인 명령어로 GET 요청을 할 수 있다.

curl 명령어 뒤에 url을 입력하면 응답을 바로 보여준다. 

아래 예시에서는 HTML 문서를 받아온다. 

$ curl www.example.com

 

cURL 옵션 확인하기

curl 기능이 많다 보니 옵션도 다양하다.

옵션은 curl 명령어와 url 사이에 -- 또는 - 을 이용해 표기한다. 

자주 사용하는 옵션 정보는 curl --help 명령어로  확인 가능하다.

모든 옵션은 curl --help all로 확인 가능하다. 필요한 옵션은 help를 보는 게 가장 좋은 것 같다. 

$ curl --help
Usage: curl [options...] <url>
 -d, --data <data>          HTTP POST data
 -f, --fail                 Fail fast with no output on HTTP errors
 -h, --help <category>      Get help for commands
 -i, --include              Include protocol response headers in the output
 -o, --output <file>        Write to file instead of stdout
 -O, --remote-name          Write output to a file named as the remote file
 -s, --silent               Silent mode
 -T, --upload-file <file>   Transfer local FILE to destination
 -u, --user <user:password> Server user and password
 -A, --user-agent <name>    Send User-Agent <name> to server
 -v, --verbose              Make the operation more talkative
 -V, --version              Show version number and quit

This is not the full help, this menu is stripped into categories.
Use "--help category" to get an overview of all categories.
For all options use the manual or "--help all".

 

cURL POST 요청 Json 데이터 전송 

나는 주로 curl -i -X POST -H "header1" -H "header2" -d "data..." url 옵션을 자주 사용한다.

  • -i는 응답 헤더를 출력해 준다.
  • -X는 요청 method를 표기한다. 
  • -H는 요청에 서버에게 전송할 커스텀 헤더를 추가할 수 있다.
  • -d는 서버에게 전송할 데이터 값을 입력한다.

옵션을 사용해서 json 데이터를 전송하는 Post 예시를 작성했다. 

아래 예제에서는 json 데이터를 전송하기 때문에 -H 옵션을 사용해 헤더에 컨텐트 타입을 명시해 줬다. 

curl -i \
> -X POST \
> -d "{\"key1\": \"test\", \"key2\": \"test\"}" \
> -H "Content-Type: application/json" \
> "https://httpbin.org/post"
# -i 옵션으로 응답 헤더 출력 
HTTP/2 200
date: Sat, 23 Sep 2023 13:22:16 GMT
content-type: application/json
content-length: 470
server: gunicorn/19.9.0
access-control-allow-origin: *
access-control-allow-credentials: true
# 응답 body, 테스트한 요청 정보를 출력
{
  "args": {},
  "data": "{\"key1\": \"test\", \"key2\": \"test\"}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "32",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.1.2",
  },
  "json": {
    "key1": "test",
    "key2": "test"
  },
  "origin": "http://127.0.0.1/",
  "url": "https://httpbin.org/post"
}

 

예시 요청을 보낼 때 터미널 사용에 있어서 약간의 팁은 아래와 같다. 

 

터미널에서 \ 입력 후 엔터키를 치면 줄 바꿈이 가능하다.

앞에 명령어와 붙여서 \ 를 사용하면 안 된다. 공백으로 옵션을 구분하기 때문에 명령어와 붙여서 \ 사용하면 옵션을 인식하지 못한다.

요청이 길어지면 줄 바꿈을 하면서 입력하면 가독성이 좋아진다.

 

json 데이터를 전송할 때 큰따옴표를 중복해서 써야 하는데 이 경우도 안쪽의 큰따옴표 앞에 \를 넣어주면 "로 인식하게 된다.

반응형