WINDOWS RESTful服务上的cURL POST命令行

时间:2012-08-06 19:01:16

标签: windows api post curl command-line

我的问题: 使用命令行工具卷曲我的localhost服务器,同时发送一些数据和我的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
  2. 返回数据的结果

    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 \":\"数据在这里\",\" data2 \":\" data2到这里\"}' http:// localhost / path / to / api

    3

      

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

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

8 个答案:

答案 0 :(得分:103)

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

答案 1 :(得分:44)

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

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

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

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

让json更具可读性。

答案 2 :(得分:15)

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

  

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

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

  

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

     

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

有用的链接:

  

Where i was downloading the curl for windows command line?

     

For more information on how to install and get curl working with cygwin just go here

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

答案 3 :(得分:5)

至少对于我测试的Windows二进制版本(Generic Win64 no-SSL binary,当前基于7.33.0),您受到如何解析命令行参数的限制。圣诞节的答案描述了该设置中的正确语法,该语法也适用于批处理文件。使用提供的示例:

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:1)

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

答案 6 :(得分: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

答案 7 :(得分:0)

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