在 WINDOWS RESTful 服务上的 cURL POST 命令行

我的问题是: 使用命令行工具卷曲我的本地主机服务器,同时发送一些数据和 POST 请求是不工作的。

什么似乎导致了这个错误: 想象一下这样的事情

  1. curl -i -X POST -H 'Content-Type: application/json' -d '{"data1": "data goes here", "data2": "data2 goes here"}' http:localhost/path/to/api

返回数据的结果

curl: (6) Could not resolve host: application; No data record of requested type
curl: (6) Could not resolve host: data goes here,; No data record of requested type
curl: (6) Could not resolve host: data2; No data record of requested type
curl: (3) [globbing] unmatched close brace/bracket at pos 16

经过一番搜索,我发现问题不在于请求所使用的语法,因为它可以在 UNIX shell 上工作。

你可能使用 Windows 吗? 这看起来像一个完全破碎的外壳 不能正确处理单引号和双引号。 我刚刚试了那个命令行,它在我的 linux 机器上运行良好。 Http://curl.haxx.se/mail/archive-2011-03/0066.html

我试图与那些“逃避”的人一起工作,但仍然不起作用

2.

Curl-i-X POST-H‘ Content-Type: application/json’-d’{“ data1”: “ data goes here”,“ data2”: “ data2 goes here”}’http://localhost/path/to/api

3.

Curl-i-X POST-H‘ Content-Type: application/json’-d’{“ data1”: “ data goes here”,“ data2”: “ data2 goes here”}’http://localhost/path/to/api

所以我放弃了。 Windows 似乎把 POST 上发送的 JSON 对象搞得一团糟

209458 次浏览

替代解决方案: 比命令行更加用户友好的解决方案:

如果您正在寻找一种用户友好的方式来发送和请求数据 使用 HTTP 方法,而不是简单的 GET 方法 一个类似 http://goo.gl/rVW22f的铬扩展 高级休息客户端

对于那些希望使用命令行的人,我推荐 cygwin:

最后,我用 CURL 安装了 cygwin,它允许我们 < strong > < em > 获取它 Linux 的感觉-在 Windows 上

使用 Cygwin 命令行,这个问题已经停止,最重要的是, 1上使用的请求语法工作良好。

有用的链接:

我在哪里下载的 cURL 为 Windows 命令行?

有关如何安装和使用 curl 的详细信息,请参阅 Cygwin 到这里来

我希望能有所帮助,因为我花了一早上在这上面。

我在我的 win7 x64笔记本电脑上遇到了同样的问题,使用标记为 Win64-通用 wSSL的 curl 版本,通过使用非常相似的命令行格式,我可以让它工作起来:

C:\Projects\curl-7.23.1-win64-ssl-sspi>curl -H "Content-Type: application/json" -X POST http://localhost/someapi -d "{\"Name\":\"Test Value\"}"

与第二个转义版本不同的是,它在转义版本和头参数值周围使用了双引号。更喜欢 linux shell 语法。

另一个比使用引号更容易的命令行替代方法是将 json 放入一个文件中,并使用 curl 参数的@前缀,例如在 json.txt 中使用以下内容:

{ "syncheader" : {
"servertimesync" : "20131126121749",
"deviceid" : "testDevice"
}
}

那么在我的情况下,我发出:

curl localhost:9000/sync -H "Content-type:application/json" -X POST -d @json.txt

让 json 更易读。

  1. 尝试使用双引号(”)而不是单引号(’)。
  2. 要保留 JSON 格式的引号,请尝试将它们加倍(“”)。
  3. 要在数据中保留引号,可以尝试像下面这样(“”)对它们进行双转义。

    curl ... -d "{""data1"": ""data1 goes here"", ""data2"": ""data2 goes here""}"
    curl ... -d "{""data"": ""data \\""abc\\"" goes here""}"
    

至少对于我测试过的 Windows 二进制版本(目前基于 7.33.0通用 Win64无 SSL 二进制文件) ,在解析命令行参数时会受到限制。Xmas 给出的答案描述了该设置中的正确语法,该设置也适用于批处理文件。使用提供的例子:

curl -i -X POST -H "Content-Type: application/json" -d "{""data1"":""data goes here"",""data2"":""data2 goes here""}" http:localhost/path/to/api

为了避免必须处理转义字符(这取决于解析命令行所使用的库) ,一个更简洁的替代方法是将标准 json 格式的文本放在一个单独的文件中:

curl -i -X POST -H "Content-Type: application/json" -d "@body.json" http:localhost/path/to/api

Powershell 6.2.3上还有一个可供选择的跨平台解决方案:

$headers = @{
'Authorization' = 'Token 12d119ad48f9b70ed53846f9e3d051dc31afab27'
}


$body = @"
{
"value":"3.92.0",
"product":"847"
}
"@




$params = @{
Uri         = 'http://local.vcs:9999/api/v1/version/'
Headers     = $headers
Method      = 'POST'
Body        = $body
ContentType = 'application/json'


}


Invoke-RestMethod @params

我们可以使用下面的 Curl 命令命令提示符发送请求。 使用下面的 Curl 命令,将单引号替换为双引号,删除下面格式中不存在的引号,并使用 ^符号。

curl http://localhost:7101/module/url ^
-d @D:/request.xml ^
-H "Content-Type: text/xml" ^
-H "SOAPAction: process" ^
-H "Authorization: Basic xyz" ^
-X POST

JSON 中的双引号需要转义,整个 JSON 需要用双引号括起来。为了不用手动转义或者为 JSON 使用额外的文件,您可以使用 CMD 替换变量中的字符串来将 "转义为 \":

set json={"data1": "data goes here", "data2": "data2 goes here"}
curl -i -X POST -H 'Content-Type: application/json' -d "%json:"=\"%" http://localhost/path/to/api