As we shift toward microservice oriented architectures, APIs are becoming more and more pervasive. While there are many tools that help us be more productive, none are as universal as curl. Before we dive into some of the common commands I use, here are other tools which are crucial to have in your toolbox.

Make a GET request

A GET request is the simplest kind of request you can do with curl. You only have to specify URL.

% curl https://httpbin.org/get
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.43.0"
  },
  "origin": "",
  "url": "https://httpbin.org/get"
}

Make a HEAD request

Sometimes you are only interested in the response headers. You can use the -I flag to specify a HEAD request.

% curl -I https://httpbin.org/headers
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 04 Nov 2016 21:54:59 GMT
Content-Type: application/json
Content-Length: 105
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Follow the location

A lot of requests result in a 301 or 302 redirect, and sometimes there are several redirects before you reach the final destination. If you want to find the final destination you can use the HEAD request along with the -L flag to tell curl to follow the location.

% curl -IL https://httpbin.org/redirect/2
HTTP/1.1 302 FOUND
Server: nginx
Date: Fri, 04 Nov 2016 21:54:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 247
Connection: keep-alive
Location: /relative-redirect/1
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

HTTP/1.1 302 FOUND
Server: nginx
Date: Fri, 04 Nov 2016 21:54:05 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
Location: /get
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 04 Nov 2016 21:54:05 GMT
Content-Type: application/json
Content-Length: 187
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Make a POST request

You can make a POST request by using the -X flag along with the http verb you want. In this case, we want to use POST.

curl -X POST https://httpbin.org/post
{
  "args": {},
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.43.0"
  },
  "json": null,
  "origin": "",
  "url": "https://httpbin.org/post"
}

Make a POST request with data

When making POST (PUSH or PATCH) requests we will often want to set the body data. To do this, you can use the -d flag.

% curl -X POST -d "foo=bar" https://httpbin.org/post
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "foo": "bar"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "7",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.43.0"
  },
  "json": null,
  "origin": "",
  "url": "https://httpbin.org/post"
}

Make a POST request with headers

When sending a POST request, you will often need to set additional headers. For example, you may need to set the Content-Type header when the body of the request contains JSON. To do so, you can use the -H flag.

% curl -X POST -d '{"foo": "bar"}' -H "Content-Type: application/json" https://httpbin.org/post
{
  "args": {},
  "data": "{\"foo\": \"bar\"}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Content-Length": "14",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.43.0"
  },
  "json": {
    "foo": "bar"
  },
  "origin": "",
  "url": "https://httpbin.org/post"
}

Set BasicAuth credentials

There are two ways to set the credentials for basic auth. You can prepend the username and password domain or use the --user flag

% curl -I https://httpbin.org/basic-auth/root/password --user root:password
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 04 Nov 2016 22:09:39 GMT
Content-Type: application/json
Content-Length: 47
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

% curl -I https://root:password@httpbin.org/basic-auth/root/password
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 04 Nov 2016 22:10:07 GMT
Content-Type: application/json
Content-Length: 47
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

Measure Request Duration

Sometimes you want to measure the time it takes to receive a response from the server. For this we can use the -w option and specify a format. Since we are only interested in the time, we will also use the -s option to put curl in silent mode and the -o option to redirect the output.

% curl -s -o /dev/null -w "Total Time: %{time_total}\n" "https://httpbin.org/delay/3"
Total Time: 3.456