So senden Sie Dateiinhalte als Body-Entität mit cURL

207

Ich verwende das Befehlszeilenprogramm cURL, um HTTP-POST an einen Webdienst zu senden. Ich möchte den Inhalt einer Datei als Hauptentität des POST einfügen. Ich habe versucht, -d </path/to/filename>sowie andere Varianten mit Typinformationen wie --data </path/to/filename> --data-urlencode </path/to/filename>etc ... zu verwenden. Die Datei ist immer angehängt. Ich brauche es als Körpereinheit.

Roy Hinkley
quelle

Antworten:

338

Ich glaube, Sie suchen nach der @filenameSyntax, z.

neue Zeilen entfernen

curl --data "@/path/to/filename" http://...

Behalte neue Zeilen

curl --data-binary "@/path/to/filename" http://...

=====

Durch das Einrollen werden alle Zeilenumbrüche aus der Datei entfernt. Wenn Sie die Datei mit intakten Zeilenumbrüchen senden möchten, verwenden Sie --data-binaryanstelle von --data

Jeffrey Froman
quelle
21
Wenn Sie wirklich ausgefallen sein möchten, können Sie Folgendes tun: Weist cat file.txt | curl --data "@-" `(< url.txt )` @-Curl an, von stdin zu lesen. Sie können auch einfach die Umleitung verwenden (< x.txt ), um das einzugeben , was Sie möchten. Wenn Sie Bash verwenden.
Breedly
62
Durch das Einrollen werden alle Zeilenumbrüche aus der Datei entfernt. Wenn Sie die Datei mit intakten Zeilenumbrüchen senden möchten, verwenden Sie --data-binaryanstelle von --data.
Chris
Wie würde man nun Anmeldeinformationen hinzufügen, um diese Anfrage zu autorisieren?
anon58192932
@ anon58192932 - Das hängt vom Sicherheitsprotokoll des Servers ab. Wenn Sie name:valuePaare wie einen Benutzernamen und ein Kennwort verwenden, fügen Sie die erforderlichen Header hinzu, die den Erwartungen des Dienstes entsprechen: --header: "<header_name>:<header_value>"als einzelne Zeichenfolge.
Roy Hinkley
19

Ich weiß, dass die Frage beantwortet wurde, aber in meinem Fall habe ich versucht, den Inhalt einer Textdatei an die Slack Webhook- API zu senden, und aus irgendeinem Grund hat die obige Antwort nicht funktioniert. Egal, das hat mir endlich den Trick getan:

curl -X POST -H --silent --data-urlencode "payload={\"text\": \"$(cat file.txt | sed "s/\"/'/g")\"}" https://hooks.slack.com/services/XXX
Plätzchenteig
quelle
Dieser konvertiert keine Punkte in Unterstriche (. -> _) und behält Zeilenumbrüche bei. Vielen Dank!
Ramon Fincken
1
Es ist cool, aber es beantwortet die Frage nicht, da die Datei in der Befehlszeile aufgelöst wird, anstatt für Curl angegeben zu werden. Ich frage mich auch, ob alle Sonderzeichen der Shell entkommen müssen - aber ich weiß nicht genug darüber;)
Gerard ONeill
Danke, du hast mein Leben gerettet!
Aryswisnu
Bei einer riesigen Inhaltsdatei funktioniert die oben genannte Locke nicht. curl: argument list too longIn diesem Fall ist die akzeptierte Antwort Lebensrettercurl --data "@/path/to/filename" http://...
weiterer Programmierer von