Wie tätige ich einen Curl POST-Aufruf in Windows?


5

Ich versuche, den folgenden Befehl unter Windows 10 auszuführen:

D:\>curl -i -X POST -H "Content-Type:application/json" -d '{  "firstName" : "Frodo",  "lastName" : "Baggins" }' http://localhost:8080/people

Leider erzeugt es zahlreiche Fehler:

curl: (6) Could not resolve host: firstName
curl: (7) Failed to connect to  port 80: Connection refused
curl: (6) Could not resolve host: Frodo,
curl: (6) Could not resolve host: lastName
curl: (7) Failed to connect to  port 80: Connection refused
curl: (6) Could not resolve host: Baggins
curl: (3) [globbing] unmatched close brace/bracket in column 1

Anscheinend versteht es die Syntax nicht.

Warum ist das so und wie kann das behoben werden?

D:\>curl --version
curl 7.46.0 (x86_64-pc-win32) libcurl/7.46.0 OpenSSL/1.0.2e zlib/1.2.8 WinIDN libssh2/1.6.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL libz

1
Sie können immer versuchen, git bash unter Windows zu verwenden, um sich unter Windows unix-
gerechter

Antworten:


6

Eine andere Möglichkeit besteht darin, doppelte Anführungszeichen wie folgt mit einem Backslash zu maskieren:

curl -i -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"Frodo\",  \"lastName\" : \"Baggins\" }" http://localhost:8080/people

bitte Jungs, schaut
euch

3

Es sieht so aus, als würdest du es benutzen cmd.exe. Die Regeln für das Entkommen von Kommandozeilencharakteren sind sowohl archaisch als auch schrecklich. Ich empfehle stattdessen die Verwendung von Powershell. Es werden Regeln verwendet, die denen bashanderer * nix-Shells sehr viel ähnlicher sind (obwohl nicht identisch, insbesondere, weil `(backtick) anstelle von Backslash als Escape-Zeichen verwendet wird).

Hier ist der Befehl in Powershell auf meinem System:

& 'C:\Program Files\Git\mingw64\bin\curl' -i -X POST -H "Content-Type:application/json" -d '{  "firstName" : "Frodo",  "lastName" : "Baggins" }' http://localhost:8080/people

Das &Anführungszeichen ist erforderlich, da der Pfad zum Programm eine Zeichenfolge in Anführungszeichen ist. Ich musste den Pfad angeben, da ich kein curl.exein meinem Windows habe PATH. Ich konnte mich jedoch einfach aus dem Leerzeichen in "Programme" entfernen:

C:\Program` Files\Git\mingw64\bin\curl -i -X POST -H "Content-Type:application/json" -d '{  "firstName" : "Frodo",  "lastName" : "Baggins" }' http://localhost:8080/people

Ansonsten funktionieren einfache und doppelte Anführungszeichen so, wie Sie sie verwenden. Dabei wird 'der Anfang einer Zeichenfolge begrenzt und die "Zeichen werden genauso wörtlich dargestellt.

Beachten Sie , dass Sie den Pfad zu einem schaffen haben curlausführbare Datei, oder zumindest angeben curl.exe; curlan sich ist es ein Powershell-Alias ​​für das Invoke-WebRequestCmdlet, das die meisten Funktionen des cURL-Programms ausführen kann, jedoch eine sehr unterschiedliche Argumentensyntax aufweist.

Auch wenn Sie Powershell von der Verwendung aus aufrufen können , würde das hier nicht wirklich helfen, da Sie die Zeichenfolge ohnehin mit der albernen Syntax umgehen müssten.cmdpowershell -c <command>cmd


Eine weitere Option ist die Verwendung des Windows-Subsystems für Linux (WSL), mit dem Sie Linux-Programme (einschließlich der Ubuntu-Standardversionen von bashund curl) direkt unter Windows ausführen können , ohne dass eine VM oder ein Neustart erforderlich ist. Ausführliche Informationen hierzu finden Sie unter https://msdn.microsoft.com/en-us/commandline/wsl/about . Die Kurzversion wird jedoch in einem beliebigen Eingabeaufforderungs- oder Powershell-Fenster ausgeführt bash(oder ausgeführt bash.exe) und installiert das Linux-Subsystem oder zumindest sagen, wie.


Für Neulinge im Thread ist Curl seit einiger Zeit in Windows 10 enthalten. source: techcommunity.microsoft.com/t5/Containers/… Um zu überprüfen, ob Windows 10 installiert ist, führen Sie in PowerShell oder CMD Folgendes aus:C:\Windows\System32\curl.exe --help
Bewc

1

Das Problem ist das Argument -d mit doppelten Anführungszeichen als Argument. Sie müssen es in Anführungszeichen setzen und die darin enthaltenen Anführungszeichen umgehen.

Sie sollten in der Lage sein:

curl -i -X POST -H "Content-Type:application/json" -d "{  ^"firstName^" : ^"Frodo^",  ^"lastName^" : ^"Baggins^" }" http://localhost:8080/people

Persönlich würde ich sie in eine Datei stecken und dann aus Gründen der Klarheit -d @Dateiname verwenden.


0

Eine andere Problemumgehung in Windows ist die Verwendung von Bash aus Cygwin. Ich hatte das gleiche Problem, mit Bash funktioniert es für mich.

Unter Windows 10 behandelt die integrierte Linux-Anwendungsunterstützung möglicherweise auch die einfachen Anführungszeichen.


2
Warum in aller Welt würden Sie Cygwin verwenden, wenn Win10 die vollständige Unterstützung von Linux-Anwendungen bietet? Kann auch Wine unter Windows verwenden!
CBHacking

@CBHacking, die Frage ist nicht Windows 10 markiert, oder?
Arjan

2
@Arjan Es sollte sein (und ist es jetzt), wie das OP in der Frage "Ich versuche, den folgenden Befehl unter Windows 10
auszuführen

In diesem Fall und wenn die integrierte Windows 10 Linux-Unterstützung auch die einfachen Anführungszeichen wie Cygwin unterstützt, würde ich eine Bearbeitung für die Antwort @David vorziehen.
Arjan

0

Windows Curl kennt keine einfachen Anführungszeichen. Daher können Sie doppelte Anführungszeichen für Ihre Nutzlast verwenden und alle anderen doppelten Anführungszeichen innerhalb dieser Nutzlast umgehen. Das kommt wie folgt heraus:

curl -d "{\"firstName\": \"Frodo\",  \"lastName\" : \"Baggins\" }" -H "Content-Type:application/json" -X POST http://localhost:8080/people
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.