How to send a header using a HTTP request through a cURL call?
Asked Answered
A

11

1990

I wish to send a header to my Apache server on a Linux box. How can I achieve this via a cURL call?

Apotheosize answered 10/12, 2008 at 16:38 Comment(1)
There 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.Limulus
G
908

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&param2=value2" http://hostname/resource

For file upload:

curl --form "[email protected]" 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/

Source

Glenglencoe answered 7/10, 2013 at 5:15 Comment(7)
what is meant by @filename for the RESTful post? are you POSTing a file to a REST server? that seems odd to mePleasing
For 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.Dremadremann
More detailed answer here: #14978911 :)Branle
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 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.»Consequent
@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.Clinic
@Consequent 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.Hangover
If you're just going to copy someone's code, at least link the source.Penta
B
2324

man curl:

   -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.

Bronnie answered 10/12, 2008 at 16:41 Comment(7)
If 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.comFilm
If people want examples I'll just leave this here: bropages.orgArchibald
man pages (on OSX, at least) now DO include an example: Example: # curl -H "X-First-Name: Joe" 192.168.0.1Zoubek
@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 example.com"Microminiaturization
This post should be the accepted answer. The currently accepted answer, however correct, only answers the OPs question implicitly.Afghanistan
For whatever reason, this works for me only if I remove the space after the colon.Illume
Funny how this answer is basically "RTFM" hahaNerveracking
G
908

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&param2=value2" http://hostname/resource

For file upload:

curl --form "[email protected]" 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/

Source

Glenglencoe answered 7/10, 2013 at 5:15 Comment(7)
what is meant by @filename for the RESTful post? are you POSTing a file to a REST server? that seems odd to mePleasing
For 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.Dremadremann
More detailed answer here: #14978911 :)Branle
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 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.»Consequent
@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.Clinic
@Consequent 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.Hangover
If you're just going to copy someone's code, at least link the source.Penta
S
294

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'));
Silvereye answered 3/4, 2010 at 9:49 Comment(5)
@Silvereye it works fine in some cases, but in others CURL sends an additional header "Expect: 100-continue" - any idea on how to remove it ?Mercerize
@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:'));Tamica
OP didn't say anything about PHP thoughtPrearrange
Header name is upper cased with underscores, and HTTP_ is prefixed. For example, "protection-token" becomes "HTTP_PROTECTION_TOKEN".Avestan
@Prearrange 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.Promulgate
L
63

Use -H or --header.

Man page: http://curl.haxx.se/docs/manpage.html#-H

Literature answered 10/12, 2008 at 16:41 Comment(2)
-H option can be used in command prompt, like: curl -H "pwd:123" localhost/test.phpCyanate
Thanks. Short, concise and covered by link to doc. However the link is obsolete already, the new one now is curl.haxx.se/docs/manpage.html#-HCytogenetics
C
50

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"
Calv answered 14/10, 2015 at 9:44 Comment(1)
Thanks. I didnt realize the mandatory quotes for this kind of url.Debarath
C
28

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",
    }
  ]
}'
Cinthiacintron answered 7/1, 2019 at 20:34 Comment(2)
I think it used in bash, Not in cmd. Am I right ? Do let me know sir.Baez
Yeah its bash then.Baez
C
28

I use Postman.

Execute whatever call you want to do. Then, postman provides a handy tool to show the curl code .

Run it in the terminal. enter image description here

enter image description here

Clothe answered 9/4, 2019 at 11:3 Comment(3)
This 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 requirementsMicroscope
While 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.Amphiprostyle
See here for a visual guide for how to generate this.Penta
S
10

I've switched from curl to Httpie; the syntax looks like:

http http://myurl HeaderName:value
Silvery answered 2/9, 2015 at 20:39 Comment(0)
C
7

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
Coating answered 9/8, 2017 at 10:27 Comment(1)
Doesn't that try to read headers from a file named {'custom_header'='custom_header_value'}?Thelmathem
L
6

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
Lishalishe answered 13/2, 2020 at 14:23 Comment(3)
This has almost nothing to do with the original posted question.Polite
@Polite 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.Lishalishe
It's powershell Curl function - not curl.exeElusive
P
3

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
Polar answered 12/1, 2022 at 13:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.