curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET "http://hostname/resource"
curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET "http://hostname/resource"
curl -i -H 'Content-Type: application/json' -H 'Accept: application/json' -X PUT -d '{"updated_field1":"updated_value1"}' "http://hostname/resourcex"
curl -i -H 'Accept: application/json' -X POST -F "filename=@/file/path" -F "other_field=its_value" "http://hostname/resource"
curl -i -H 'Content-Type: application/json' -H 'Accept: application/json' -X DELETE -d '{"key1":"value1"}' "http://hostname/resource"
curl -XGET -vvv http://hostname/resource > dev\null
-k
: not check SSL certificates-L
: follow redirects-v
: get verbose output-V
: get headers at output
Default operation is a GET:
curl http://api.example.com:8080/statuses/1234
Use square brackets with a dashed range:
curl http://api.example.com:8080/items/[1230-1234]
Use curly braces with comma-delimited strings:
curl http://api.example.com:8080/products/{abc,def,ghi}/status
Use the header option: -H
or --header
curl -H 'Accept: application/json' http://api.example.com:8080/items/1234
Use multiple -H
options:
curl -H 'Accept: application/json' -H 'Accept-Encoding: gzip' http://api.example.com:8080/products/a1b2c3ef/status
Note: the output from this is likely to be unreadable, because it's gzipped!
More likely you'd use this with ETags:
curl -H 'Accept: application/json' -H 'If-None-Match: "1cc044-172-3d9aee80"'
http://api.example.com:8080/products/a1b2c3ef/status
Use the verbose option: -v or --verbose
curl -v -H http://api.example.com
To send data to the server, you use either POST or PUT, depending on what the API requires. To do a POST, you simply use the -d
(--data
) with some content:
curl -d "name=Ted" http://api.example.com:8080/customers
Note that this uses application/x-www-form-urlencoded
as the Content-Type, i.e., as if it was submitted by an HTML Form. You can use multiple -d
options, which will be combined, e.g., these two commands produce the same content:
curl -d "first=Ted" -d "last=Young" http://api.example.com:8080/customers
curl -d "first=Ted&last=Young" http://api.example.com:8080/customers
If you want to send JSON, you'll need to specify the Content-Type explicitly using the -H
(header) option:
curl -d '{"name": "Ted"}' -H 'Content-Type: application/json' http://api.example.com:8080/items
If you need to use the PUT method, you'll need to override the method with the -X
(--request
) option:
curl -X PUT -d '{"name": "Ted"}' -H 'Content-Type: application/json' http://api.example.com:8080/items/1234
curl --data-binary @/path/to/file <url>
By adding --data-binary
, curl will change the method to POST
and
set the Content-Type
header to application/x-www-form-urlencoded
.
curl -X POST -H 'Content-Type: image/jpeg' -T pictures/car.jpg <url>
-H '<Header-Name>: <Header-Value>'
-X GET|PUT|POST|DELETE|OPTIONS
See what curl is actually doing:
curl -v
curl -D -
On unix:
curl -o /dev/null <other-options> <url>
On Windows:
curl -o nul <other-options> <url>
This is useful if combined with -D
to give you the headers only:
curl -D - -o /dev/null <url>
This header is mostly useful on conditional GET requests:
-H 'If-None-Match: <value-of-etag-header>'
This header is mostly useful on conditional PUT|POST requests:
-H 'If-Match: <value-of-etag-header>'
This header is mostly useful on conditional GET requests:
-H 'If-Modified-Since: <value-of-last-modified-header>'
This header is mostly useful on conditional PUT|POST requests:
-H 'If-Unmodified-Since: <value-of-last-modified-header>'