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

Asked 2023-09-21 08:07:21 View 463,529

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

  • 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. - anyone
  • Here is a 2minute video link for above commented approach youtu.be/L3m6cpQPsV0 - anyone

Answers

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.

Answered   2023-09-21 08:07:21

  • 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.com - anyone
  • If people want examples I'll just leave this here: bropages.org - anyone
  • man pages (on OSX, at least) now DO include an example: Example: # curl -H "X-First-Name: Joe" 192.168.0.1 - anyone
  • @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" - anyone
  • This post should be the accepted answer. The currently accepted answer, however correct, only answers the OPs question implicitly. - anyone

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 "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/

Answered   2023-09-21 08:07:21

  • what is meant by @filename for the RESTful post? are you POSTing a file to a REST server? that seems odd to me - anyone
  • 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. - anyone
  • More detailed answer here: stackoverflow.com/questions/14978411/… :) - anyone
  • 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.» - anyone
  • @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. - anyone

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'));

Answered   2023-09-21 08:07:21

  • @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 ? - anyone
  • @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:')); - anyone
  • OP didn't say anything about PHP thought - anyone
  • Header name is upper cased with underscores, and HTTP_ is prefixed. For example, "protection-token" becomes "HTTP_PROTECTION_TOKEN". - anyone
  • @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. - anyone

Answered   2023-09-21 08:07:21

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"

Answered   2023-09-21 08:07:21

  • Thanks. I didnt realize the mandatory quotes for this kind of url. - anyone

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",
    }
  ]
}'

Answered   2023-09-21 08:07:21

  • I think it used in bash, Not in cmd. Am I right ? Do let me know sir. - anyone
  • Yeah its bash then. - anyone

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

Answered   2023-09-21 08:07:21

  • 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 requirements - anyone
  • 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. - anyone

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

http http://myurl HeaderName:value

Answered   2023-09-21 08:07:21

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

Answered   2023-09-21 08:07:21

  • Doesn't that try to read headers from a file named {'custom_header'='custom_header_value'}? - anyone

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

Answered   2023-09-21 08:07:21

  • This has almost nothing to do with the original posted question. - anyone
  • @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. - anyone
  • It's powershell Curl function - not curl.exe - anyone

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

Answered   2023-09-21 08:07:21