cURL 到 PowerShell - 哈希表

Posted

技术标签:

【中文标题】cURL 到 PowerShell - 哈希表【英文标题】:cURL to PowerShell - Hash Table 【发布时间】:2019-04-27 01:47:20 【问题描述】:

因此,在将我之前的 cURL 发布到 PowerShell 哈希表问题(已解决)之后,我现在又遇到了另一个问题,这次将 cURL 转换为 PowerShell,数据中有 3 个哈希表(?)(或者更有可能我的 PowerShell 技能)。这一次,我的脚本通过 PowerShell 返回:

...General Error java.util.LinkedHashMap cannot be cast to java.util.List

这是通过 Postman 完美运行的 cURL:

curl -X PATCH \
  https://example.com/apis/v1.1/parameters \
  -H 'Authorization: Bearer 1234567890' \
  -H 'Content-Type: application/json' \
  -H 'cache-control: no-cache' \
  -d '
    "data": [
        
            "DUID": 3299,
            "AID": 551,
            "CID": 10002,
            "Parameters": [
                
                    "name": "Customer.1/AddressLine1",
                    "value": "SOMEWHERE ROAD"
                
            ]
        
    ]
'

这是 PowerShell 脚本,我使用我之前的问题中给出的建议构建了它:

cURL to PowerShell - Double hash table in --data?

$CURLEXE = 'C:\Windows\System32\curl.exe'
$URL1 = "https://example.com/apis/v1.1/parameters"

$Body =   @
      'data'= @
      'DUID'= 3299;
      'AID'= 551;
      'CID'= 10002;
      'Parameters'=
      @'name'= "Customer.1/AddressLine1";
        'value'= "SOMEWHERE ROAD"
                
            

$CurlArgument = '-X', 'PATCH',
                $URL1,
                '-H', 
                $AuthBearer,
                '-H', 'Content-Type: application/json',
                '-H', 'cache-control: no-cache',
                '-d', 
                (($Body | ConvertTo-Json) -replace '"', '\"')

& $CURLEXE @CurlArgument

我的 $CurlArgument 看起来像这样:

-X
PATCH
https://example.com/apis/v1.1/parameters
-H
Authorization: Bearer 1234567890
-H
Content-Type: application/json
-H
cache-control: no-cache
-d

    \"data\":  
                 \"CID\":  10002,
                 \"DUID\":  3299,
                 \"AID\":  551,
                 \"Parameters\":  
                                          \"value\":  \"SOMEWHERE ROAD\",
                                          \"name\":  \"Customer.1/AddressLine1\"
                                      
             

返回此错误:

"status":"FAILURE","errors":["code":"5004","name":"General Error","severity":"3","message":"发生错误操作过程中","details":"5004":"General Error java.util.LinkedHashMap cannot be cast to java.util.List"]

可能是“Customer.1/AddressLine1”字段中的正斜杠吗?我尝试了第二次 - 替换这些,但仍然得到同样的错误:

(($Body | ConvertTo-Json) -replace '"', '\"' -replace '/', '\/')
(($Body | ConvertTo-Json) -replace '"', '\"' -replace '/', '\2f')
(($Body | ConvertTo-Json) -replace '"', '\"' -replace '/', '\%2f')

可能是数据哈希表中缺少方括号吗?它们在 cURL 中但不在 PowerShell 中,但是在我之前的脚本中我没有方括号,而且 PowerShell 似乎不喜欢它们。

难道是PowerShell改变了“值”和“名称”的顺序?

任何帮助将不胜感激。

更新 感谢 @mklement0 迄今为止的帮助,我已将我的 PowerShell 编辑为以下解决了它!

$Body =   @
      data = , @
      DUID = 3299
      AID = 551
      CID = 10002
      Parameters = , @
         name = "Customer.1/AddressLine1"
         value = "SOMEWHERE ROAD"
                             
                
            

$CurlArgument = '-X', 'PATCH',
                'https://example.com/apis/v1.1/parameters',
                '-H', 
                $AuthBearer,
                '-H', 'Content-Type: application/json',
                '-H', 'cache-control: no-cache',
                '-d', 
                (($Body | ConvertTo-Json -Depth 4) -replace '"', '\"')

& $CURLEXE @CurlArgument

【问题讨论】:

您在第 1 部分中的正文在括号中有一个 JSON 数组。根据我对 JSON 的理解,第二个不是数组 - 它是一个哈希表。这就是您在 PoSh 版本中使用 @ 而不是 @() 定义的。 【参考方案1】:

Lee Daily 提供了关键指针:

您的 JSON 格式需要一个 数组 子对象 ([...]) 作为 datadata.Parameters 属性的值,而看似等价的您在 $Body 中构建的哈希表只有一个标量子对象。

需要对您的代码进行两次调整:

确保datadata.Parameters 包含数组

使用, <object>构造一个包含<object>的单元素数组; ConvertTo-Json 自动将数组转换为 JSON [ ... ] 表示法。

-Depth 4ConvertTo-Json结合使用,以确保对象层次结构中的所有子对象都被完整地表示。

$CURLEXE = 'C:\Windows\System32\curl.exe'
$URL1 = "https://example.com/apis/v1.1/parameters"

$Body = @
  data = , @ # Note the "," to construct an *array*
    DUID = 3299
    AID = 551
    CID = 10002
    Parameters = , @ # Note the "," to construct an *array*
       name = "Customer.1/AddressLine1"
       value = "SOMEWHERE ROAD"
    
  


# Note the -Depth 4 in the ConvertTo-Json call.
$CurlArgument = '-X', 'PATCH',
                $URL1,
                '-H', 
                $AuthBearer,
                '-H', 'Content-Type: application/json',
                '-H', 'cache-control: no-cache',
                '-d', 
                (($Body | ConvertTo-Json -Depth 4) -replace '"', '\"')


& $CURLEXE @CurlArgument

【讨论】:

非常感谢@mklement0 - 我的 URL 后面缺少一个逗号,这意味着我的 $AuthBearer 没有被发送,但是您建议的上述修改解决了我的问题!出于兴趣,所有这些都记录在哪里,以便我可以做一些阅读/学习? 很高兴听到这个消息,@Simon。 PowerShell 不仅有针对特定 cmdlet 的帮助主题(例如,Get-Help ConvertTo-Json),还有关于各种概念主题的帮助主题:Get-Help about_Hash_TablesGet-Help about_Splatting。虽然有Get-Help about_Quoting_Rules,但不包括调用外部程序的额外要求;你可以了解他们here。

以上是关于cURL 到 PowerShell - 哈希表的主要内容,如果未能解决你的问题,请参考以下文章

powershell Powershell函数从文件中读取哈希表文本表示并将其转换为哈希表对象

PowerShell:组合两个哈希表

在 PowerShell 中合并哈希表:如何?

Powershell 排序哈希表

PowerShell初级篇●Powershell数组和哈希表

在 Powershell 中创建多维哈希表数组