我尝试在 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.exe
PATH
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.exe
;curl
它本身是 cmdlet 的 Powershell 别名Invoke-WebRequest
,它可以完成 cURL 程序可以做的大部分工作,但参数语法非常不同。
此外,当你能cmd
使用调用 Powershell powershell -c <command>
,但这在这里实际上没有什么帮助,因为无论如何你都必须使用 的cmd
愚蠢语法来转义字符串。
另一种选择是使用适用于 Linux 的 Windows 子系统 (WSL),它允许您直接在 Windows 上运行 Linux 程序(包括默认的 Ubuntu 版本bash
和curl
),无需 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 应用程序支持可能也会处理单引号。