I wish to send a header to my Apache server on a Linux box. How can I achieve this via a cURL call?
-
99There is a good way to learn how to use curl for http requests by examples. Download the newest version of Postman, make any http request configuration as you wish at user interface level (post, put, get.. for instance, with headers and json body ) and then click in "generate code" and choose "curl" option. It gives you the equivalent command line. – Vinicius Lima May 28 '16 at 22:51
-
3Here is a 2minute video link for above commented approach https://youtu.be/L3m6cpQPsV0 – VedantK Aug 22 '21 at 13:28
11 Answers
-H/--header <header>
(HTTP) Extra header to use when getting a web page. You may specify
any number of extra headers. Note that if you should add a custom
header that has the same name as one of the internal ones curl would
use, your externally set header will be used instead of the internal
one. This allows you to make even trickier stuff than curl would
normally do. You should not replace internally set headers without
knowing perfectly well what you're doing. Remove an internal header
by giving a replacement without content on the right side of the
colon, as in: -H "Host:".
curl will make sure that each header you add/replace get sent with
the proper end of line marker, you should thus not add that as a
part of the header content: do not add newlines or carriage returns
they will only mess things up for you.
See also the -A/--user-agent and -e/--referer options.
This option can be used multiple times to add/replace/remove multi-
ple headers.
Example 1: Single Header
curl --header "X-MyHeader: 123" www.google.com
Example 2: Multiple Headers
curl --header "Accept: text/javascript" --header "X-Test: hello" -v www.google.com
You can see the request that curl sent by adding the -v
option.
-
115If you want to send multiple headers use more than one --header, it is ok, curl will parse each as a different header. There is no way to separate headers inside the same --header parameter. example: curl --header "Accept: javascript" --header "test: hello" -v www.google.com – Hatoru Hansou Sep 24 '15 at 06:41
-
5If people want examples I'll just leave this here: http://bropages.org/ – Rachel K. Westmacott Aug 15 '16 at 10:57
-
1man pages (on OSX, at least) now DO include an example: Example: # curl -H "X-First-Name: Joe" http://192.168.0.1/ – JESii Apr 06 '17 at 13:51
-
9@MartinKonicek and others: I HIGHLY recommend the tldr utiltiy (brew, etc install tldr). Its only examples. eg "- Send a request with an extra header, using a custom HTTP method: curl -H 'X-My-Header: 123' -X PUT http://example.com" – Dec 13 '17 at 16:41
-
This post should be the accepted answer. The currently accepted answer, however correct, only answers the OPs question implicitly. – Robert Mar 24 '21 at 08:52
-
For whatever reason, this works for me only if I remove the space after the colon. – Dabbler Dec 09 '21 at 20:53
-
GET:
with JSON:
curl -i -H "Accept: application/json" -H "Content-Type: application/json" http://hostname/resource
with XML:
curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET http://hostname/resource
POST:
For posting data:
curl --data "param1=value1¶m2=value2" http://hostname/resource
For file upload:
curl --form "fileupload=@filename.txt" http://hostname/resource
RESTful HTTP Post:
curl -X POST -d @filename http://hostname/resource
For logging into a site (auth):
curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login
curl -L -b headers http://localhost/

- 14,650
- 9
- 27
- 46
-
what is meant by @filename for the RESTful post? are you POSTing a file to a REST server? that seems odd to me – JesseBoyd Oct 16 '17 at 18:17
-
13For people arriving later who might be wondering the same thing... @ notation is a way of reading the data to send to the server from a file, rather than inline-ing it into the curl request. You don't POST a file per se, you're POSTing the contents of the file as the body of your POST request. – f1dave Oct 24 '17 at 02:05
-
More detailed answer here: https://stackoverflow.com/questions/14978411/http-post-and-get-using-curl-in-linux/14978657 :) – Amith Koujalgi Dec 19 '17 at 18:09
-
If I understand the usage of headers correctly: header `Accept` is meant for the *client* (asking/requesting), who wishes to have this, BUT the Header `Content-Type` is only the servers *answer* nothing more, it is not mistakenly the wish of the client: *“I want this type of content”* . Right? So for **GET** `curl -i -H "Accept: application/json" http://hostname/resource` should be it. Am I wrong? See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type «In responses, a `Content-Type` header tells the client what the content type of the returned content actually is.» – andreas.naturwiki Jun 22 '20 at 09:46
-
1@andreas.naturwiki, again not to be confused. From MDN, «In responses...» means `Content-Type` at the response. Not the request. `Content-Type` will always refer to type of data transmitted between two parties. If it is on request header, it means the client says 'Yeah I'm sending you data type `application/json`' to the server. If it is on response, it means the server says 'Now I'm sending you data type `text/plain`' to the client. – fa wildchild Dec 24 '20 at 06:06
-
@andreas.naturwiki Content-Type is what you're sending in the body of the request and Accept is what you want in the body of the response. Server responds with Content-Type, which can be different from your Accept. – Sebastian Sipos Nov 22 '21 at 19:55
In PHP:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName:HeaderValue'));
or you can set multiple:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('HeaderName:HeaderValue', 'HeaderName2:HeaderValue2'));

- 31,877
- 16
- 137
- 115

- 3,086
- 1
- 16
- 3
-
1@James it works fine in some cases, but in others CURL sends an additional header "Expect: 100-continue" - any idea on how to remove it ? – coding_idiot Feb 12 '13 at 23:50
-
1@coding_idiot: You can pass "Expect:" in the array of header values to disable it. Ex.: curl_setopt($ch,CURLOPT_HTTPHEADER,array('HeaderName: HeaderValue', 'Expect:')); – ether Sep 09 '13 at 18:12
-
17
-
Header name is upper cased with underscores, and HTTP_ is prefixed. For example, "protection-token" becomes "HTTP_PROTECTION_TOKEN". – Bimal Poudel Nov 27 '17 at 19:11
-
1@hanshenrik That's true, but OP didn't say anything about the command line either. In fact, the question should have been put on hold for being unclear. Today a newbie wouldn't get away with such a sloppy question. – Aug 01 '20 at 07:50
Use -H or --header
.
Man page: http://curl.haxx.se/docs/manpage.html#-H
-
10-H option can be used in command prompt, like: curl -H "pwd:123" http://localhost/test.php – shasi kanth Feb 11 '11 at 05:58
-
Thanks. Short, concise and covered by link to doc. However the link is obsolete already, the new one now is https://curl.haxx.se/docs/manpage.html#-H – Oleksii Kyslytsyn Mar 23 '18 at 13:34
GET (multiple parameters):
curl -X GET "http://localhost:3000/action?result1=gh&result2=ghk"
or
curl --request GET "http://localhost:3000/action?result1=gh&result2=ghk"
or
curl "http://localhost:3000/action?result1=gh&result2=ghk"
or
curl -i -H "Application/json" -H "Content-type: application/json" "http://localhost:3000/action?result1=gh&result2=ghk"

- 2,704
- 2
- 25
- 25
You can also send multiple headers, data (JSON for example), and specify Call method (POST,GET) into a single CUrl call like this:
curl -X POST(Get or whatever) \
http://your_url.com/api/endpoint \
-H 'Content-Type: application/json' \
-H 'header-element1: header-data1' \
-H 'header-element2: header-data2' \
......more headers................
-d '{
"JsonExArray": [
{
"json_prop": "1",
},
{
"json_prop": "2",
}
]
}'

- 565
- 6
- 9
-
1I think it used in bash, Not in cmd. Am I right ? Do let me know sir. – Gray Programmerz Mar 16 '21 at 10:30
-
I use Postman.
Execute whatever call you want to do. Then, postman provides a handy tool to show the curl code .

- 447
- 4
- 11
-
1This is a good hack to speed things up but be careful of escaping the single quotes or double quotes if you are using shell script on windows as shell script has it's own formatting requirements – Thierrydev May 15 '19 at 10:56
-
1While postman is nice tool but when you dont have a graphical environment like in Kubernetes pods it is useless. Learn curl and you can always test rest. – Namphibian Feb 27 '20 at 00:18
I've switched from curl to Httpie; the syntax looks like:
http http://myurl HeaderName:value

- 23,007
- 8
- 61
- 83
In case you want send your custom headers, you can do it this way:
curl -v -H @{'custom_header'='custom_header_value'} http://localhost:3000/action?result1=gh&result2=ghk

- 31,877
- 16
- 137
- 115

- 442
- 4
- 13
-
Doesn't that try to read headers from a file named `{'custom_header'='custom_header_value'}`? – Robin A. Meade Feb 10 '21 at 06:38
In anaconda envirement through windows the commands should be: GET, for ex:
curl.exe http://127.0.0.1:5000/books
Post or Patch the data for ex:
curl.exe http://127.0.0.1:5000/books/8 -X PATCH -H "Content-Type: application/json" -d '{\"rating\":\"2\"}'
PS: Add backslash for json data to avoid this type of error => Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)
and use curl.exe
instead of curl
only to avoid this problem:
Invoke-WebRequest : Cannot bind parameter 'Headers'. Cannot convert the "Content-Type: application/json" value of type
"System.String" to type "System.Collections.IDictionary".
At line:1 char:48
+ ... 0.1:5000/books/8 -X PATCH -H "Content-Type: application/json" -d '{\" ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-WebRequest], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

- 7,074
- 10
- 69
- 74
-
-
@MarkHu It responses to the question headline, not the question body :). The is many questions similar to the question headline so they will take adv of my answer and I was one of them so once I find the answer I shared it. – DINA TAKLIT Feb 23 '21 at 20:21
-
Here are the some curl commands for most common http methods.
Domain Object considered here is
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document
@Validated
public class Movie {
@Id
private String id;
private String name;
@NotNull
private Integer year;
@NotNull
private List<String> cast;
private LocalDate release_date;
}
POST-CREATE-MOVIE
curl -i \
-d '{"id":1, "name": "Dhoom", "year":2004,"cast":["John Abraham", "Abhishek Bachan"],"release_date": "2004-06-15"}' \
-H "Content-Type: application/json" \
-X POST http://localhost:8080/v1/movies
GET-ALL-MOVIES
curl -i http://localhost:8080/v1/movies
GET-MOVIE-BY-ID
curl -i http://localhost:8080/v1/movies/1
PUT-UPDATE-MOVIE
curl -i \
-d '{"id":1, "name": "Dhoom", "year":2005,"cast":["John Abhraham", "Abhishek Bachhan", "Uday Chopra", "Isha Deol"],"release_date": "2005-03-25"}' \
-H "Content-Type: application/json" \
-X PUT http://localhost:8080/v1/movies/1
DELETE-MOVIE
curl -i -X DELETE http://localhost:8080/v1/movies/1

- 3,317
- 34
- 31