77

我的问题: 使用命令行工具来卷曲我的本地主机服务器,同时发送一些数据以及我的 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

经过一番搜索,我发现问题不可能是用于请求的 sintax,因为它适用于 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在这里\", \"data2\": \"data2在这里\"}' http://localhost/path/to/api

3.

curl -i -X POST -H 'Content-Type: application/json' -d '{\"data1\": \"data在这里\", \"data2\": \"data2在这里\"}' http://localhost/path/to/api

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

4

8 回答 8

133

我在我的 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 语法。

于 2012-09-19T15:41:47.593 回答
53

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

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

然后在我的情况下,我发出:

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

使 json 也更具可读性。

于 2014-01-13T09:14:41.620 回答
17

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

如果您正在寻找一种用户友好的方式来使用 HTTP 方法而不是简单的 GET 来发送和请求数据,那么您可能正在寻找一个 chrome 扩展,就像这个http://goo.gl/rVW22f称为 AVANCED REST CLIENT

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

我最终安装了带有 CURL 的 cygwin,这让我们能够在 Windows 上获得那种 Linux 的感觉!

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

有用的链接:

我在哪里下载 curl for windows 命令行?

有关如何安装和让 curl 与 cygwin 一起使用的更多信息,请转到此处

我希望它对某人有所帮助,因为我整个上午都在这上面。

于 2012-08-07T11:56:22.840 回答
11

至少对于我测试的 Windows 二进制版本(通用 Win64 no-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
于 2015-05-13T19:55:17.163 回答
7
  1. Try to use double quotes (") instead of single ones (').
  2. To preserve JSON format quotes, try doubling them ("").
  3. To preserve quotes inside data, try to double-escape them like this (\\"").

    curl ... -d "{""data1"": ""data1 goes here"", ""data2"": ""data2 goes here""}"
    curl ... -d "{""data"": ""data \\""abc\\"" goes here""}"
    
于 2015-02-18T20:13:14.553 回答
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
于 2019-10-23T15:04:40.343 回答
1

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
于 2021-04-28T14:42:24.110 回答
0

我们可以在 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
于 2020-09-09T09:16:10.963 回答