WINDOWS RESTful 服务上的 cURL POST 命令行

问题描述 投票:0回答:8

我的问题: 使用命令行工具来卷曲我的本地主机服务器,同时发送一些数据和我的 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 '内容类型:application/json' -d '{\"data1\": \"数据在此处\", \"data2\": \"数据2在此处\"} 'http://localhost/path/to/api

curl -i -X POST -H '内容类型:application/json' -d '{\"data1\"\: \"数据在此处\", \"data2\"\: \"数据2在此处\ “}'http://localhost/path/to/api

所以我放弃了。 Windows 似乎搞乱了 POST 上发送的 JSON 对象

windows api post curl command-line
8个回答
152
投票

我在 win7 x64 笔记本电脑上遇到了同样的问题,并且能够使用标记为 Win64 - Generic w SSL 的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 语法。


61
投票

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

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

然后就我而言,我发出:

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

也使 json 更具可读性。


19
投票

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

如果您正在寻找一种用户友好的方式来发送和请求数据 您可能正在寻找除简单 GET 之外的其他 HTTP 方法 对于像这样的 chrome 扩展 http://goo.gl/rVW22f 称为 高级休息客户端

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

我最终使用 CURL 安装了 cygwin,这使我们能够 得到它 Linux 感觉 - 在 Windows 上!

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

有用的链接:

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

有关如何安装和使用curl的更多信息 cygwin 就到这里

我希望它对某人有帮助,因为我花了整个上午的时间。


13
投票

至少对于我测试的 Windows 二进制版本(通用 Win64 无 SSL 二进制文件,当前基于 7.33.0),您会受到命令行参数解析方式的限制。 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

7
投票
  1. 尝试使用双引号 (") 而不是单引号 (')。
  2. 要保留 JSON 格式的引号,请尝试将它们加倍 ("")。
  3. 要保留数据内的引号,请尝试像这样对它们进行双重转义 (\"")。

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

4
投票

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

2
投票

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

1
投票

我们可以在Windows命令提示符下使用下面的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
© www.soinside.com 2019 - 2024. All rights reserved.