【问题标题】:POST request with Powershell 2.0 using cURL使用 cURL 的 Powershell 2.0 的 POST 请求
【发布时间】:2014-09-14 20:37:32
【问题描述】:

场景

除其他外,Powershell 2.0 没有有用的 cmdlet Invoke-RestMethod。

我无法升级到版本 3,我发现的大多数示例都使用版本 3。

我找到了this article,但是对于我的简单场景来说,这似乎太复杂了。

我需要编写一个以 Json 格式发布数据的 Powershell 脚本,例如

{"Id":5,"Email":"test@com","DataFields":null,"Status":0}

我尝试过的

我能够获取数据。这是我尝试过的脚本之一。

curl -v --user username:password https://api.dotmailer.com/v2/account-info

但是,当我尝试 POST 时,我不知道将消息正文放在脚本中的哪个位置。这是我到目前为止所得到的:

curl -v -X POST -H "Accept: application/json" -H "Content-Type: application/json" -u username:password -d '{"Id":5,"Email":"test@com","OptInType":0,"EmailType":0, "DataFields":null,"Status":0}' https://api.dotmailer.com/v2/contacts

返回以下错误:

{"message":"Could not parse the body of the request based on the content type \"application/json\" ERROR_BODY_DOES_NOT_MATCH_CONTENT_TYPE"}*

问题

谁能建议如何使用 cURL 从 Powershell POST Json 数据?

任何关于我为什么会收到我在我尝试过的部分中提到的错误的指针将不胜感激。

谢谢。

【问题讨论】:

  • @DavidBrabant 我已经看到了这个问题,我不认为我的问题是重复的,因为我不是在询问基本身份验证。
  • 嗯。事实上,你是。 “我需要编写一个 Powershell 脚本,以 Json 格式发布数据并使用基本身份验证”。 AFAIK,要发布 JSON,您只需将其转换为具有 UTF8 编码的字节并将 application/json 设置为内容类型。所以从链接的问题中剪切并粘贴相关部分,其中$Post = '{"Id":5,"Email":"test@com","DataFields":null,"Status":0}'
  • @FrodeF。很公平,我已经编辑了这个问题以避免这种情况(我确实知道如何编写基本的身份验证位)。由于不清楚,我还编辑了标题:我想使用 cURL 命令并在 powershell 中运行它们。
  • 如果有人需要回答这个问题,请参考:stackoverflow.com/a/23556669/4192663

标签: rest powershell curl


【解决方案1】:

请注意,问题是关于 curl.exe外部程序,而不是 PowerShell 的 Invoke-WebRequest cmdlet(不幸的是,别名为 @987654325 @ 在更高的 PowerShell 版本中,抢占对外部程序的调用,除非明确指定了 .exe 扩展名 (curl.exe ...)。

不幸且出乎意料的是,您必须在作为参数传递给外部程序的字符串中\-escape 嵌入" 实例。

因此,即使:

'{"Id":5,"Email":"test@com","DataFields":null,"Status":0}'

应该工作,但它没有,因为long-standing bug;相反,您必须使用:

'{\"Id\":5,\"Email\":\"test@com\",\"DataFields\":null,\"Status\":0}'

更多信息请参见this answer

【讨论】:

    【解决方案2】:

    从 curl 的 man page 看来,您需要使用 -d 开关:

    curl -v --user username:password -H "Content-Type: application/json" -d '{"Id":5,"Email":"test@com","DataFields":null,"Status":0}' https://api.dotmailer.com/v2/contacts
    

    【讨论】:

    • 谢谢,但是您提供的命令返回以下错误:{"message":"Content type \"application/x-www-form-urlencoded\" is not supported. Please use one of: application/json,application/xml ERROR_CONTENT_TYPE_IS_NOT_SUPPORTED"}*
    • 编辑答案以添加所需的标题。
    • 您编辑的答案返回了我在上面“我尝试过的内容”部分中提到的错误。知道为什么吗?
    • 嗯,它是一个有效的 json.. 尝试在正文周围添加方括号:-d '[{"Id":5,"Email":"test@com","DataFields":null,"Status":0}]' 或在值 -d '{"Id":"5","Email":"test@com","DataFields":"null","Status":"0"}' 周围添加双引号或两者兼而有之。
    • 完成了,但没有快乐。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多