如何在 Windows 中发出 Curl POST 调用?

如何在 Windows 中发出 Curl POST 调用?

我尝试在 Windows 10 下发出以下命令:

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

不幸的是,它会产生许多错误:

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

显然,它不理解语法。

为什么会这样?如何解决?

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

另一种选择是使用反斜杠屏蔽双引号,如下所示:

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

答案2

看起来您正在使用cmd.exe。命令提示符的字符转义规则既陈旧又糟糕。我建议改用 Powershell;它使用的规则与bash其他 *nix shell 上的规则更相似(尽管并不完全相同,特别是因为它使用 `(反引号)作为转义字符而不是反斜杠)。

以下是我的系统上 Powershell 中的命令:

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

前导是必需的,因为程序的路径是带引号的字符串。我必须指定路径,因为我的 Windows 中&没有。但是,我只需在“Program Files”中转义空格即可:curl.exePATH

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

单引号和双引号的其他功能与使用时一样,它们用于'界定字符串的开头,并且"以文字字符的形式出现在字符串内部。

请注意必须提供curl可执行文件的路径,或者至少指定curl.execurl它本身是 cmdlet 的 Powershell 别名Invoke-WebRequest,它可以完成 cURL 程序可以做的大部分工作,但参数语法非常不同。

此外,当你cmd使用调用 Powershell powershell -c <command>,但这在这里实际上没有什么帮助,因为无论如何你都必须使用 的cmd愚蠢语法来转义字符串。


另一种选择是使用适用于 Linux 的 Windows 子系统 (WSL),它允许您直接在 Windows 上运行 Linux 程序(包括默认的 Ubuntu 版本bashcurl),无需 VM 或重新启动。有关此内容的完整详细信息,请访问https://msdn.microsoft.com/en-us/commandline/wsl/about,但简短的版本是尝试从任何命令提示符或 Powershell 窗口运行bash(或bash.exe),它将安装 Linux 子系统或至少告诉您如何操作。

答案3

问题在于您的 -d 参数以双引号作为参数。您需要将其括在引号中,并对里面的双引号进行转义。

你应该能够做到:

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

就我个人而言,我会将它们粘贴到文件中,然后使用 -d @filename 以便更清楚。

答案4

Windows 中的另一种解决方法是使用 Cygwin 中的 bash。我遇到了同样的问题,使用 bash 对我来说没问题。

对于 Windows 10,内置的 Linux 应用程序支持可能也会处理单引号。

相关内容