The Ultimate Guide to Sending POST Requests with cURL
Whether you‘re an API developer testing endpoints, a sysadmin automating tasks, or a curious tinkerer exploring the world of HTTP requests, cURL is an indispensable tool to have in your arsenal. As a powerful command-line utility for sending web requests, cURL makes it easy to interact with servers and test APIs right from your terminal, no fancy GUI required.
In this comprehensive guide, we‘ll dive deep into how to harness the full potential of cURL to send POST requests. We‘ll start with the basics of installing and using cURL, break down the anatomy of a POST request, and explore more advanced techniques to customize your requests to handle everything from authentication to posting files. By the end, you‘ll be a cURL power user ready to tackle any API.
What is cURL?
cURL (pronounced like "curl") stands for Client URL. It‘s a command-line tool and library for sending and receiving data using URL syntax. With cURL, you can send HTTP requests to interact with web servers and APIs, making it useful for testing, debugging and automating tasks involving web services.
Originally released in 1997, cURL has evolved into one of the most widely-used tools for transferring data with URLs thanks to its stability, rich feature set, and ubiquity across platforms. It supports a wide range of protocols including HTTP, HTTPS, FTP, SFTP, and many more.
While there are GUI-based tools like Postman that serve a similar purpose, cURL‘s command-line interface makes it lightweight and easy to call from scripts. This makes it ideal for use cases like monitoring uptime, downloading files, or building basic REST clients.
Installing cURL
The good news is cURL comes pre-installed on most modern operating systems including Linux, macOS, and Windows 10+. To check if you already have it, open a terminal and type:
curl --version
If you see version information, you‘re good to go! If not, you‘ll need to install it.
On Linux (Ubuntu/Debian):
sudo apt update
sudo apt install curl
On macOS with Homebrew:
brew install curl
For Windows 10+, cURL should already be available. On older Windows versions, you‘ll need to download a build from the official cURL website: https://curl.se/download.html
Anatomy of a cURL Request
The basic structure of a cURL command looks like this:
curl [options] [URL]
Some common options you‘ll use:
-X
or--request
specifies the HTTP method (GET, POST, PUT, DELETE, etc.)-H
or--header
adds request headers-d
or--data
includes data to send in the request body-u
or--user
specifies a username and password for authentication
Let‘s start by dissecting a basic cURL POST request:
curl -X POST -H "Content-Type: application/json" -d ‘{"name": "John"}‘ https://example.com/api/users
Here‘s what each part does:
-X POST
sets the HTTP method to POST-H "Content-Type: application/json"
adds a request header indicating we‘re sending JSON data-d ‘{"name": "John"}‘
includes JSON data in the request bodyhttps://example.com/api/users
is the URL we‘re sending the request to
Sending a Basic POST Request
At its most basic, a cURL POST just needs the POST method, a URL, and some data to send. Let‘s test it out with the excellent JSONPlaceholder API which lets you send dummy requests to a test server.
To create a new post, we‘ll send a POST request to the /posts
endpoint with a JSON body containing a title and body:
curl -X POST -d ‘{"title": "foo", "body": "bar", "userId": 1}‘ https://jsonplaceholder.typicode.com/posts
If successful, you‘ll get back a response containing the post object you sent along with a unique ID:
{
"title": "foo",
"body": "bar",
"userId": 1,
"id": 101
}
That‘s it! You‘ve just sent your first POST request with cURL. However, most real-world APIs will expect a Content-Type
header as well, so let‘s add that in:
curl -X POST -H "Content-Type: application/json" -d ‘{"title": "foo", "body": "bar", "userId": 1}‘ https://jsonplaceholder.typicode.com/posts
Sending Form Data
For sending data as a form instead of JSON, you can use the -F
or --form
option:
curl -X POST -F "title=Hello world" -F "body=This is the post body" https://jsonplaceholder.typicode.com/posts
This will send a POST request with application/x-www-form-urlencoded
as the Content-Type
.
Dealing with Authentication
Many APIs require some form of authentication to access protected routes. The two most common methods are Basic Auth with a username/password combo and Bearer tokens.
For Basic Auth, use the -u
or --user
flag:
curl -X GET -u "username:password" https://api.example.com/protected
For Bearer tokens, add an Authorization
header:
curl -X GET -H "Authorization: Bearer abcxyz" https://api.example.com/protected
Replace abcxyz
with your actual API token. Be careful not to leak sensitive credentials by hardcoding them in your cURL commands!
Posting Files
To send files via POST, use the -F
or --form
option with @
before the file path:
curl -X POST -F "image=@/path/to/file.jpg" https://api.example.com/upload
This will send a multipart POST request with the file included in the image
field. You can include additional fields as well:
curl -X POST -F "image=@/path/to/file.jpg" -F "caption=My dog" https://api.example.com/upload
Setting Custom Headers
You can set any arbitrary header in your request using the -H
or --header
flag. For example, to set a custom User-Agent
header:
curl -X GET -H "User-Agent: MyCoolApp/1.0" https://api.example.com/posts
Some APIs may require custom headers for purposes like API versioning:
curl -X GET -H "Accept-Version: 2.0" https://api.example.com/posts
Handling Errors
When something goes wrong with your request, cURL will return a non-zero exit code and typically print an error message with more details. Some common error codes you‘ll encounter:
- 6 – Couldn‘t resolve host
- 7 – Failed to connect to host
- 22 – HTTP page not retrieved (often means a 400 or 500 error from the server)
- 28 – Operation timeout
You can inspect the HTTP response code by using the -i
flag to include headers in the output:
curl -i -X GET https://api.example.com/not-found
HTTP/1.1 404 Not Found
...
A 404 error means the resource you requested wasn‘t found on the server. A 401 Unauthorized or 403 Forbidden means you don‘t have permission to access it. 500-level errors indicate a problem on the server side.
To see the full response along with the headers, use -v
for verbose output:
curl -v -X GET https://api.example.com/posts
This will show you the request headers sent by cURL, the response headers, and the response body.
Advanced Techniques
Here are a few more advanced tricks to level up your cURL skills:
- Follow redirects by using the
-L
flag:
curl -L -X GET https://api.example.com/redirect
- Save cookies received from the server using
-c
:
curl -c cookies.txt -X GET https://api.example.com/login
- Send saved cookies in a subsequent request using
-b
:
curl -b cookies.txt -X GET https://api.example.com/protected
- Output the response to a file using
-o
:
curl -o posts.json -X GET https://api.example.com/posts
- Use GZip compression to speed up transfers with
--compressed
:
curl --compressed -X GET https://api.example.com/posts
GUI Alternatives to cURL
While cURL is incredibly powerful, sometimes a graphical interface can be easier to work with, especially for exploring unfamiliar APIs. Here are a couple popular alternatives:
- Postman (https://www.postman.com/) – A full-featured API development environment that lets you easily construct and send requests, organize collections, and collaborate with team members.
- Insomnia (https://insomnia.rest/) – Similar to Postman with a sleek, modern interface and advanced features like environment variables and code generation.
These GUI clients can be great for prototyping and debugging, but cURL still excels for scripting and automation tasks.
Real-World Use Cases
So what can you actually use cURL POST requests for? Here are a few examples:
- Creating records in a database via a REST API
- Submitting web forms and processing the response
- Uploading files to a server
- Sending push notifications through a service like Firebase Cloud Messaging
- Posting messages to Slack using their Web API
- Triggering a cloud function or serverless action
- Simulating user actions for testing web applications
- Scraping websites by posting form data and parsing HTML
- Building basic API clients and SDKs
The possibilities are endless! Once you‘re comfortable with the basics of cURL, you can integrate it into your own applications and workflows to level up your development, ops, and automation game.
Wrapping Up
In this guide, we‘ve taken a comprehensive look at how to use cURL to send POST requests packed with data, authentication, and custom options. Whether you‘re new to cURL or a seasoned pro, we hope this guide has armed you with the knowledge you need to tackle any API.
Just remember:
- Use
-X POST
to set the request method to POST - Include request data with
-d
for JSON or-F
for forms and files - Set the
Content-Type
header to match your data format - Use
-u
for Basic Auth or-H
for token authentication - Check for errors by inspecting the exit code and using
-i
or-v
for more info - Try out GUI alternatives like Postman or Insomnia for exploring APIs
- Apply your skills to real-world use cases like creating resources, uploading files and automating workflows
Now fire up your terminal and start POST-ing! The world of APIs awaits. And if you get stuck, just remember: when in doubt, RTFM (Read The Friendly Manual).