代码之家  ›  专栏  ›  技术社区  ›  Simon

curl to powershell-哈希表

  •  2
  • Simon  · 技术社区  · 6 年前

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

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

    这是通过邮递员完美工作的卷发:

    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\"
                                          }
                 }
    }
    

    返回此错误:

    {“状态”:“失败”、“错误”:[ {代码〉:“5004”、“名称”):“一般错误”、“严重性”:“3”、“消息”:“操作期间发生的错误”、“详细信息”:{“5004”:“一般错误java. UTI.LIKEDHHMAP不能强制转换为java. U.L.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是否可以更改“value”和“name”的顺序?

    如有任何帮助,我们将不胜感激。

    更新 感谢@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 回复  |  直到 6 年前
        1
  •  1
  •   mklement0    6 年前

    Lee Daily 提供关键指标:

    您的JSON格式需要 数组 子对象 ( [...] )作为 data data.Parameters 属性,而在 $Body 只有一个标量子对象。

    需要对代码进行两个调整:

    • 确保 数据 数据参数 包含 数组 :

      • 使用 , <object> 构造包含 <object> (二) ConvertTo-Json 自动将数组转换为JSON [ ... ] 表示法。
    • 使用 -Depth 4 具有 转换为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