How to read headers from file using cURL?

2019-07-04 11:40发布

I found this.

And I wrote this variant:

#!/bin/bash
while read line ; do
  headers="$headers -H '$line'"
done < public/headers.txt
echo $headers
curl -X PUT \
     $headers \
     -d @'public/example.json' \
     echo.httpkit.com

In headers.txt I have:

X-PAYPAL-SECURITY-USERID:123
X-PAYPAL-SECURITY-PASSWORD:123

But when I run ./public/curl.sh I am not getting the headers I am sending.

I isolated the issue with an env var:

$ x='-H some:asd'
$ curl $x echo.httpkit.com
=> header was NOT present
$ curl -H 'some:asd' echo.httpkit.com
=> header was present
$ curl -H some:asd echo.httpkit.com
=> header was present

How can I correctly insert a variable in the header section?

标签: linux shell curl
2条回答
Rolldiameter
2楼-- · 2019-07-04 11:55

Let's ask shellcheck:

In yourscript line 3:
  headers="$headers -H '$line'"
                       ^-- SC2089: Quotes/backslashes will be treated literally. 
                                   Use an array.

Ok, then let's do that:

#!/bin/bash
while read line ; do
headers=("${headers[@]}" -H "$line")
done < public/headers.txt
echo "${headers[@]}"
curl -X PUT \
   "${headers[@]}" \
   -d @'public/example.json' \
   echo.httpkit.com

Result:

{
  "method": "PUT",
  "uri": "/",
  "path": {
    "name": "/",
    "query": "",
    "params": {}
  },
  "headers": {
    "host": "echo.httpkit.com",
    "user-agent": "curl/7.35.0",
    "accept": "*/*",
    "x-paypal-security-userid": "123",      //      <----- Yay!!
    "x-paypal-security-password": "123",
    "content-length": "32",
    "content-type": "application/x-www-form-urlencoded"
  },
  "body": "\"This is text from example.json\"",
  "ip": "127.0.0.1",
  "powered-by": "http://httpkit.com",
  "docs": "http://httpkit.com/echo"
}
查看更多
Fickle 薄情
3楼-- · 2019-07-04 11:56

If you don't want to put the HTTP headers on a command line (perhaps for security reasons), you can still have curl read them directly from a file.

curl -H @headerfile.txt https://www.google.com/  # requires curl >=7.55.0

If your curl is older than 7.55.0:

  • Use the option -K/--config <config file>, and put several -H/--header <header> lines in the text file.

For more details, please see my answer in the original article:

https://stackoverflow.com/a/48762561/5201675

查看更多
登录 后发表回答