【问题标题】:cURL POST command line on WINDOWS RESTful serviceWINDOWS RESTful 服务上的 cURL POST 命令行
【发布时间】:2012-08-03 18:37:02
【问题描述】:

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

【问题讨论】:

  • 请不要在您的问题标题中添加[solved]。如果您已经找到问题的答案,您应该将其作为答案发布。
  • 感谢@CodyGray 的警告。我会更正我的帖子。
  • 如果您的机器上安装了 git,您可以使用 git bash 进行 curl。它可以省去很多麻烦。

标签: windows api post curl command-line


【解决方案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

【讨论】:

    【解决方案2】:

    我们可以在 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
    

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        【解决方案4】:

        至少对于我测试的 Windows 二进制版本(Generic Win64 no-SSL binary,目前基于 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
        

        【讨论】:

        • 谢谢。它过去并不重要,但现在无论是 Windows 10 还是我安装的 curl 版本,我现在必须在 -d 之后为我的 json 文件参数加上引号,否则行结尾会搞砸。
        【解决方案5】:
        1. 尝试使用双引号 (") 而不是单引号 (')。
        2. 要保留 JSON 格式的引号,请尝试将它们加倍 ("")。
        3. 要在数据中保留引号,请尝试像这样 (\\"") 对它们进行双重转义。

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

        【讨论】:

        • 使用 Win10,cmd.exe,开箱即用,这个答案对我有用。我不得不在 Json 对象中加倍双引号,并将整个对象放在引号中。谢谢@xmas!
        • 这很好用,但这只是讨厌 windows 的另一个原因。
        【解决方案6】:

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

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

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

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

        使 json 也更具可读性。

        【讨论】:

        • 这个救了我!另请注意,如果您要发布的 JSON 中有命令行变量,您可以使用 sed 替换它们。
        【解决方案7】:

        替代解决方案:比命令行更人性化的解决方案:

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

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

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

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

        有用的链接:

        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

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

        【讨论】:

        • 这不应该是公认的答案。 OP 没有要求提供基于 Web 的 REST 客户端或替代命令行客户端的建议。他们寻求帮助,让 curl 的转义正确,user1683523 回答了这个问题。
        • 但对于许多提出这个问题的人来说,这是一个更好的答案。
        • 是的,我同意。这解决了我的问题,即使它的方式与我的预期不同。 curl 对我不起作用,无论我如何逃避引号。我尝试了 json 周围的单引号和内部的双引号,到处都是双引号,用斜线转义,双双引号。没有任何效果。谷歌扩展确实以它应该发送的方式发送它。有时,解决工具不符合预期的方法是使用不同的工具。
        【解决方案8】:

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

        【讨论】:

        • 即使在 Windows 10 中,单引号似乎也不起作用。我必须用转义的双引号来做双引号才能工作。
        猜你喜欢
        • 2011-08-15
        • 2015-12-31
        • 2010-09-10
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 2019-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多