Wie versende ich POST mit Body, Headern und HTTP-Parametern mit cURL?

39

Ich habe viele Beispiele für die Verwendung einfacher POST-Befehle in cURL gefunden, aber keine Beispiele für das Senden vollständiger HTTP-POST-Befehle, die Folgendes enthalten:

  • Header (Standardauthentifizierung)
  • HTTP-Parameter ( s=1&r=33)
  • Body Data, eine XML-Zeichenfolge

Alles was ich gefunden habe ist:

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

Das funktioniert nicht und sendet die HTTP-Parameter als Body.

user71020
quelle
Fühlt sich an wie eine mögliche Betrogene von superuser.com/questions/149329/... weiß ich , das ist spezifisch über Kopf- und dergleichen , aber die Antworten auf die andere Frage auch damit umgehen. Normalerweise markiere ich eine so alte populäre Frage nicht als Betrug, aber dies ist eine Ausnahme. Möglicherweise müssen Sie der Vollständigkeit halber ein paar Dinge verschieben.
Michael Durrant
In der Tat erwähnt die andere Antwort sehr spezifisch --headerund dies nicht
Michael Durrant

Antworten:

15

Nicht genug Ruf, um einen Kommentar abzugeben. Lassen Sie dies als Antwort, in der Hoffnung, dass es hilft.

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}

Dies habe ich für eine S3-Bucket-Acl-Put-Operation verwendet. Die Header sind in -H und der Body, der eine XML-Datei ist, befindet sich in $ {aclfile} nach -T. Das sehen Sie an der Ausgabe:

/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

Wenn URL-Parameter Sonderzeichen wie "+" enthalten, verwenden Sie --data-urlencode für jeden Parameter (der Sonderzeichen enthält):

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

HTTP "Parameter" sind Teil der URL:

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

Die Standardauthentifizierung hat eine separate Option. Es ist nicht erforderlich, einen benutzerdefinierten Header zu erstellen:

-u "user:password"

Der POST "body" kann entweder --data(für application/x-www-form-urlencoded) oder --form(für multipart/form-data) gesendet werden :

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

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

--data-binary "@binarybody.jpg"

Also, um zusammenzufassen:

curl -d "this is body" -u "user:pass" "http://localhost/?ss=ss&qq=11"
Grawity
quelle
@ Emerson: Es sollte sein; Das PHP-Modul scheint alle Funktionen zu haben, die die ursprüngliche C-Libcurl hat, und das Obige ist eine ziemlich grundlegende Funktion. Ich kenne die genaue Funktion jedoch nicht. Wenn Sie es nicht finden können, fragen Sie bei Stack Overflow.
Grawity