I found a lot of examples on how to use simple POST commands in cURL, but I didn't find examples on how to send full HTTP POST commands, which contain:

  • Headers (Basic Authentication)
  • HTTP Params (s=1&r=33)
  • Body Data, some XML string

All I found is:

echo "this is body" | curl -d "ss=ss&qq=11" http://localhost/

That doesn't work, and it sends the HTTP parameters as the body.

up vote 9 down vote accepted

Not enough reputation to comment so leave this as an answer hoping it help.

curl -L -v --post301 --post302 -i -X PUT -T "${aclfile}"  \
  -H "Date: ${dateValue}" \
  -H "Content-Type: ${contentType}" \
  -H "Authorization: AWS ${s3Key}:${signature}" \
  ${host}:${port}${resource}

This is what I used for a S3 bucket acl put operation. Headers are in -H and body which is a xml file is in ${aclfile} following -T. You can see that from the output:

/aaa/?acl
* About to connect() to 192.168.57.101 port 80 (#0)
*   Trying 192.168.57.101...
* Connected to 192.168.57.101 (192.168.57.101) port 80 (#0)
> PUT /aaa/?acl HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.57.101
> Accept: */*
> Date: Thu, 18 Aug 2016 08:01:44 GMT
> Content-Type: application/x-www-form-urlencoded; charset=utf-8
> Authorization: AWS WFBZ1S6SO0DZHW2LRM6U:r84lr/lPO0JCpfk5M3GRJfHdUgQ=
> Content-Length: 323
> Expect: 100-continue
>
< HTTP/1.1 100 CONTINUE
HTTP/1.1 100 CONTINUE

* We are completely uploaded and fine
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< x-amz-request-id: tx00000000000000000001f-0057b56b69-31d42-default
x-amz-request-id: tx00000000000000000001f-0057b56b69-31d42-default
< Content-Type: application/xml
Content-Type: application/xml
< Content-Length: 0
Content-Length: 0
< Date: Thu, 18 Aug 2016 08:01:45 GMT
Date: Thu, 18 Aug 2016 08:01:45 GMT

<
* Connection #0 to host 192.168.57.101 left intact

if url params contain special signs like "+", use --data-urlencode for every param (containing special signs) of them:

curl -G -H "Accept:..." -H "..." --data-urlencode "beginTime=${time}+${zone}" --data-urlencode "endTime=${time}+${zone}" "${url}"

HTTP "parameters" are part of the URL:

"http://localhost/?name=value&othername=othervalue"

Basic authentication has a separate option, there is no need to create a custom header:

-u "user:password"

The POST "body" can be sent via either --data (for application/x-www-form-urlencoded) or --form (for multipart/form-data):

-F "foo=bar"                  # 'foo' value is 'bar'
-F "foo=<foovalue.txt"        # the specified file is sent as plain text input
-F "foo=@foovalue.txt"        # the specified file is sent as an attachment

-d "foo=bar"
-d "foo=<foovalue.txt"
-d "foo=@foovalue.txt"
-d "@entirebody.txt"          # the specified file is used as the POST body

--data-binary "@binarybody.jpg"

So, to summarize:

curl -d "this is body" -u "user:pass" "http://localhost/?ss=ss&qq=11"
  • @Emerson: It should be; PHP's module seems to have all functions that the original C libcurl has, and the above is a fairly basic feature. I don't know the exact function to use, however. If you cannot find it, ask on Stack Overflow. – grawity Aug 6 '13 at 11:38

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.