sahilrajput.com

Learn curl

# Run script without downloading (you need sudo as per your requirement)
sudo curl https://cli-assets.heroku.com/install.sh | sh

# only response body (without response header)
curl localhost:3000

# response body + response headers
curl -i localhost:3000
# -i is alias for --include

# only response headers
curl -I localhost:3000
# -I is an alias for --head

# only response's status code
curl -sI localhost:3000 | head -n1 | awk '{print $2}'

# write output to default route-named-file named i.e., `crash` 	(CAUTION: overwrites to existing file)
curl -O localhost:3000/crash
# -O is an alias for --remote-name

# download an image
curl -O https://i.imgur.com/5pdde58.jpeg
# Output: Image downloaded to `5pdde58.jpeg` file in current folder.

# LEARN: throws error: curl >> Remote file name has no length!
curl -O localhost:3000/

# write output to custom file (lowercase o)			(CAUTION: overwrites to existing file)
curl -o myFile.txt localhost:3000
# -o is an alias for --output

# follow redirect with -L flag
curl -L google.com
# Outputs from www.google.com
#fyi: if don't used  www. prefix then curl shows us only the redirect message and informs that the page has moved to www.google.com site.

# upload via FTP
curl -u test@traversymedia.com:123456! -T hello.txt ftp://ftp.traversymedia.com

# download via FTP
curl -u test@traversymedia.com:123456! -O ftp://ftp.traversymedia.com/hello.txt


# Default --request (-X) has GET value:
curl "https://reverberate.ml"
curl --request GET https://reverberate.ml
curl -X GET https://reverberate.ml

# Sending telegram message to target group/channel with a given chat_id
curl -X POST \
	-H "Content-Type: application/json" \
	-d '{"chat_id": "1", "text": "2", "parse_mode": "HTML"}' \
	'https://api.telegram.org/bot<BOT_TOKEN>/sendMessage'

# For using multiple request headers use format like this:
`curl -H "X-Header1: value1" -H "X-Header2: value2" localhost:8080`


#### TIPS:
# Tip: replace GET with POST, PUT, PATCH, etc for such usages!**, https://www.keycdn.com/support/popular-curl-examples#13-get-method
# Tip: Use `log({headers: req.headers});` to log the headers on express server.
# Simple curl requests: https://www.keycdn.com/support/popular-curl-examples


#### OTHER HELPFUL FLAGS:
# -s for silent (it hides progressbar)
# -v for verbose

Using bash variables:

# source: https://stackoverflow.com/a/37632617/10012446
# Using bash variables inside url and body
TELEGRAM_CHAT_ID="---"
TELEGRAM_ACCESS_TOKEN="---"

# Enable Debugging
set -x 

curl -X POST \
	-H "Content-Type: application/json" \
	-d @<(cat <<EOF 
{ "chat_id": "$TELEGRAM_CHAT_ID", "text": "hello", "parse_mode": "HTML" }
EOF) \
	"https://api.telegram.org/bot$TELEGRAM_ACCESS_TOKEN/sendMessage" \

Q. Wonder what is EOF and how it works?

cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF

# Basically <<EOF allows you to enter multiple lines of text into bash which is normally now allowed and redirect it to anythng you want.
# Online resource: The EOF operator is used in many programming languages. This operator stands for the end of the file. This means that wherever a compiler or an interpreter encounters this operator, it will receive an indication that the file it was reading has ended.

# See better examples of this @ src: https://stackoverflow.com/a/21549836/10012446

Help

$ curl -h
# Usage: curl [options...] <url>
#  -d, --data <data>          HTTP POST data
#  -f, --fail                 Fail silently (no output at all) 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".

Help - all

curl -h all
# Output:
# Usage: curl [options...] <url>
#      --abstract-unix-socket <path> Connect via abstract Unix domain 
#      --alt-svc <file name> Enable alt-svc with this cache file
#      --anyauth            Pick any authentication method
#  -a, --append             Append to target file when uploading
#      --aws-sigv4 <provider1[:provider2[:region[:service]]]> Use AWS 
#      --basic              Use HTTP Basic Authentication
#      --cacert <file>      CA certificate to verify peer against
#      --capath <dir>       CA directory to verify peer against
#  -E, --cert <certificate[:password]> Client certificate file and pas
#      --cert-status        Verify the status of the server cert via O
#      --cert-type <type>   Certificate type (DER/PEM/ENG)
#      --ciphers <list of ciphers> SSL ciphers to use
#      --compressed         Request compressed response
#      --compressed-ssh     Enable SSH compression
#  -K, --config <file>      Read config from a file
#      --connect-timeout <fractional seconds> Maximum time allowed for
#      --connect-to <HOST1:PORT1:HOST2:PORT2> Connect to host
#  -C, --continue-at <offset> Resumed transfer offset
#  -b, --cookie <data|filename> Send cookies from string/file
#  -c, --cookie-jar <filename> Write cookies to <filename> after opera
#      --create-dirs        Create necessary local directory hierarchy
#      --create-file-mode <mode> File mode for created files
#      --crlf               Convert LF to CRLF in upload
#      --crlfile <file>     Use this CRL list
#      --curves <algorithm list> (EC) TLS key exchange algorithm(s) to
#  -d, --data <data>        HTTP POST data
#      --data-ascii <data>  HTTP POST ASCII data
#      --data-binary <data> HTTP POST binary data
#      --data-raw <data>    HTTP POST data, '@' allowed
#      --data-urlencode <data> HTTP POST data url encoded
#      --delegation <LEVEL> GSS-API delegation permission
#      --digest             Use HTTP Digest Authentication
#  -q, --disable            Disable .curlrc
#      --disable-eprt       Inhibit using EPRT or LPRT
#      --disable-epsv       Inhibit using EPSV
#      --disallow-username-in-url Disallow username in url
#      --dns-interface <interface> Interface to use for DNS requests
#      --dns-ipv4-addr <address> IPv4 address to use for DNS requests
#      --dns-ipv6-addr <address> IPv6 address to use for DNS requests
#      --dns-servers <addresses> DNS server addrs to use
#      --doh-cert-status    Verify the status of the DoH server cert v
#      --doh-insecure       Allow insecure DoH server connections
#      --doh-url <URL>      Resolve host names over DoH
#  -D, --dump-header <filename> Write the received headers to <filenam
#      --egd-file <file>    EGD socket path for random data
#      --engine <name>      Crypto engine to use
#      --etag-compare <file> Pass an ETag from a file as a custom head
#      --etag-save <file>   Parse ETag from a request and save it to a
#      --expect100-timeout <seconds> How long to wait for 100-continue
#  -f, --fail               Fail silently (no output at all) on HTTP e
#      --fail-early         Fail on first transfer error, do not conti
#      --fail-with-body     Fail on HTTP errors but save the body
#      --false-start        Enable TLS False Start
#  -F, --form <name=content> Specify multipart MIME data
#      --form-escape        Escape multipart form field/file names usi
#      --form-string <name=string> Specify multipart MIME data
#      --ftp-account <data> Account data string
#      --ftp-alternative-to-user <command> String to replace USER [nam
#      --ftp-create-dirs    Create the remote dirs if not present
#      --ftp-method <method> Control CWD usage
#      --ftp-pasv           Use PASV/EPSV instead of PORT
#  -P, --ftp-port <address> Use PORT instead of PASV
#      --ftp-pret           Send PRET before PASV
#      --ftp-skip-pasv-ip   Skip the IP address for PASV
#      --ftp-ssl-ccc        Send CCC after authenticating
#      --ftp-ssl-ccc-mode <active/passive> Set CCC mode
#      --ftp-ssl-control    Require SSL/TLS for FTP login, clear for t
#  -G, --get                Put the post data in the URL and use GET
#  -g, --globoff            Disable URL sequences and ranges using {} 
#      --happy-eyeballs-timeout-ms <milliseconds> Time for IPv6 before
#      --haproxy-protocol   Send HAProxy PROXY protocol v1 header
#  -I, --head               Show document info only
#  -H, --header <header/@file> Pass custom header(s) to server
#  -h, --help <category>    Get help for commands
#      --hostpubmd5 <md5>   Acceptable MD5 hash of the host public key
#      --hostpubsha256 <sha256> Acceptable SHA256 hash of the host pub
#      --hsts <file name>   Enable HSTS with this cache file
#      --http0.9            Allow HTTP 0.9 responses
#  -0, --http1.0            Use HTTP 1.0
#      --http1.1            Use HTTP 1.1
#      --http2              Use HTTP 2
#      --http2-prior-knowledge Use HTTP 2 without HTTP/1.1 Upgrade
#      --http3              Use HTTP v3
#      --ignore-content-length Ignore the size of the remote resource
#  -i, --include            Include protocol response headers in the o
#  -k, --insecure           Allow insecure server connections
#      --interface <name>   Use network INTERFACE (or address)
#  -4, --ipv4               Resolve names to IPv4 addresses
#  -6, --ipv6               Resolve names to IPv6 addresses
#      --json <data>        HTTP POST JSON
#  -j, --junk-session-cookies Ignore session cookies read from file
#      --keepalive-time <seconds> Interval time for keepalive probes
#      --key <key>          Private key file name
#      --key-type <type>    Private key file type (DER/PEM/ENG)
#      --krb <level>        Enable Kerberos with security <level>
#      --libcurl <file>     Dump libcurl equivalent code of this comma
#      --limit-rate <speed> Limit transfer speed to RATE
#  -l, --list-only          List only mode
#      --local-port <num/range> Force use of RANGE for local port numb
#  -L, --location           Follow redirects
#      --location-trusted   Like --location, and send auth to other ho
#      --login-options <options> Server login options
#      --mail-auth <address> Originator address of the original email
#      --mail-from <address> Mail from this address
#      --mail-rcpt <address> Mail to this address
#      --mail-rcpt-allowfails Allow RCPT TO command to fail for some r
#  -M, --manual             Display the full manual
#      --max-filesize <bytes> Maximum file size to download
#      --max-redirs <num>   Maximum number of redirects allowed
#  -m, --max-time <fractional seconds> Maximum time allowed for transf
#      --metalink           Process given URLs as metalink XML file
#      --negotiate          Use HTTP Negotiate (SPNEGO) authentication
#  -n, --netrc              Must read .netrc for user name and passwor
#      --netrc-file <filename> Specify FILE for netrc
#      --netrc-optional     Use either .netrc or URL
#  -:, --next               Make next URL use its separate set of opti
#      --no-alpn            Disable the ALPN TLS extension
#  -N, --no-buffer          Disable buffering of the output stream
#      --no-keepalive       Disable TCP keepalive on the connection
#      --no-npn             Disable the NPN TLS extension
#      --no-progress-meter  Do not show the progress meter
#      --no-sessionid       Disable SSL session-ID reusing
#      --noproxy <no-proxy-list> List of hosts which do not use proxy
#      --ntlm               Use HTTP NTLM authentication
#      --ntlm-wb            Use HTTP NTLM authentication with winbind
#      --oauth2-bearer <token> OAuth 2 Bearer Token
#  -o, --output <file>      Write to file instead of stdout
#      --output-dir <dir>   Directory to save files in
#  -Z, --parallel           Perform transfers in parallel
#      --parallel-immediate Do not wait for multiplexing (with --paral
#      --parallel-max <num> Maximum concurrency for parallel transfers
#      --pass <phrase>      Pass phrase for the private key
#      --path-as-is         Do not squash .. sequences in URL path
#      --pinnedpubkey <hashes> FILE/HASHES Public key to verify peer a
#      --post301            Do not switch to GET after following a 301
#      --post302            Do not switch to GET after following a 302
#      --post303            Do not switch to GET after following a 303
#      --preproxy [protocol://]host[:port] Use this proxy first
#  -#, --progress-bar       Display transfer progress as a bar
#      --proto <protocols>  Enable/disable PROTOCOLS
#      --proto-default <protocol> Use PROTOCOL for any URL missing a s
#      --proto-redir <protocols> Enable/disable PROTOCOLS on redirect
#  -x, --proxy [protocol://]host[:port] Use this proxy
#      --proxy-anyauth      Pick any proxy authentication method
#      --proxy-basic        Use Basic authentication on the proxy
#      --proxy-cacert <file> CA certificate to verify peer against for
#      --proxy-capath <dir> CA directory to verify peer against for pr
#      --proxy-cert <cert[:passwd]> Set client certificate for proxy
#      --proxy-cert-type <type> Client certificate type for HTTPS prox
#      --proxy-ciphers <list> SSL ciphers to use for proxy
#      --proxy-crlfile <file> Set a CRL list for proxy
#      --proxy-digest       Use Digest authentication on the proxy
#      --proxy-header <header/@file> Pass custom header(s) to proxy
#      --proxy-insecure     Do HTTPS proxy connections without verifyi
#      --proxy-key <key>    Private key for HTTPS proxy
#      --proxy-key-type <type> Private key file type for proxy
#      --proxy-negotiate    Use HTTP Negotiate (SPNEGO) authentication
#      --proxy-ntlm         Use NTLM authentication on the proxy
#      --proxy-pass <phrase> Pass phrase for the private key for HTTPS
#      --proxy-pinnedpubkey <hashes> FILE/HASHES public key to verify 
#      --proxy-service-name <name> SPNEGO proxy service name
#      --proxy-ssl-allow-beast Allow security flaw for interop for HTT
#      --proxy-ssl-auto-client-cert Use auto client certificate for pr
#      --proxy-tls13-ciphers <ciphersuite list> TLS 1.3 proxy cipher s
#      --proxy-tlsauthtype <type> TLS authentication type for HTTPS pr
#      --proxy-tlspassword <string> TLS password for HTTPS proxy
#      --proxy-tlsuser <name> TLS username for HTTPS proxy
#      --proxy-tlsv1        Use TLSv1 for HTTPS proxy
#  -U, --proxy-user <user:password> Proxy user and password
#      --proxy1.0 <host[:port]> Use HTTP/1.0 proxy on given port
#  -p, --proxytunnel        Operate through an HTTP proxy tunnel (usin
#      --pubkey <key>       SSH Public key file name
#  -Q, --quote <command>    Send command(s) to server before transfer
#      --random-file <file> File for reading random data from
#  -r, --range <range>      Retrieve only the bytes within RANGE
#      --raw                Do HTTP "raw"; no transfer decoding
#  -e, --referer <URL>      Referrer URL
#  -J, --remote-header-name Use the header-provided filename
#  -O, --remote-name        Write output to a file named as the remote
#      --remote-name-all    Use the remote file name for all URLs
#  -R, --remote-time        Set the remote file's time on the local ou
#  -X, --request <method>   Specify request method to use
#      --request-target <path> Specify the target for this request
#      --resolve <[+]host:port:addr[,addr]...> Resolve the host+port t
#      --retry <num>        Retry request if transient problems occur
#      --retry-all-errors   Retry all errors (use with --retry)
#      --retry-connrefused  Retry on connection refused (use with --re
#      --retry-delay <seconds> Wait time between retries
#      --retry-max-time <seconds> Retry only within this period
#      --sasl-authzid <identity> Identity for SASL PLAIN authenticatio
#      --sasl-ir            Enable initial response in SASL authentica
#      --service-name <name> SPNEGO service name
#  -S, --show-error         Show error even when -s is used
#  -s, --silent             Silent mode
#      --socks4 <host[:port]> SOCKS4 proxy on given host + port
#      --socks4a <host[:port]> SOCKS4a proxy on given host + port
#      --socks5 <host[:port]> SOCKS5 proxy on given host + port
#      --socks5-basic       Enable username/password auth for SOCKS5 p
#      --socks5-gssapi      Enable GSS-API auth for SOCKS5 proxies
#      --socks5-gssapi-nec  Compatibility with NEC SOCKS5 server
#      --socks5-gssapi-service <name> SOCKS5 proxy service name for GS
#      --socks5-hostname <host[:port]> SOCKS5 proxy, pass host name to
#  -Y, --speed-limit <speed> Stop transfers slower than this
#  -y, --speed-time <seconds> Trigger 'speed-limit' abort after this t
#      --ssl                Try SSL/TLS
#      --ssl-allow-beast    Allow security flaw to improve interop
#      --ssl-auto-client-cert Use auto client certificate (Schannel)
#      --ssl-no-revoke      Disable cert revocation checks (Schannel)
#      --ssl-reqd           Require SSL/TLS
#      --ssl-revoke-best-effort Ignore missing/offline cert CRL dist p
#  -2, --sslv2              Use SSLv2
#  -3, --sslv3              Use SSLv3
#      --stderr <file>      Where to redirect stderr
#      --styled-output      Enable styled output for HTTP headers
#      --suppress-connect-headers Suppress proxy CONNECT response head
#      --tcp-fastopen       Use TCP Fast Open
#      --tcp-nodelay        Use the TCP_NODELAY option
#  -t, --telnet-option <opt=val> Set telnet option
#      --tftp-blksize <value> Set TFTP BLKSIZE option
#      --tftp-no-options    Do not send any TFTP options
#  -z, --time-cond <time>   Transfer based on a time condition
#      --tls-max <VERSION>  Set maximum allowed TLS version
#      --tls13-ciphers <ciphersuite list> TLS 1.3 cipher suites to use
#      --tlsauthtype <type> TLS authentication type
#      --tlspassword <string> TLS password
#      --tlsuser <name>     TLS user name
#  -1, --tlsv1              Use TLSv1.0 or greater
#      --tlsv1.0            Use TLSv1.0 or greater
#      --tlsv1.1            Use TLSv1.1 or greater
#      --tlsv1.2            Use TLSv1.2 or greater
#      --tlsv1.3            Use TLSv1.3 or greater
#      --tr-encoding        Request compressed transfer encoding
#      --trace <file>       Write a debug trace to FILE
#      --trace-ascii <file> Like --trace, but without hex output
#      --trace-time         Add time stamps to trace/verbose output
#      --unix-socket <path> Connect through this Unix domain socket
#  -T, --upload-file <file> Transfer local FILE to destination
#      --url <url>          URL to work with
#  -B, --use-ascii          Use ASCII/text transfer
#  -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
#  -w, --write-out <format> Use output FORMAT after completion
#      --xattr              Store metadata in extended file attributes

Complete Manual - man curl

Tip: Click below image to open 5k+ manual pages of curl.

Check out ^^ above complete manual page