【问题标题】:Can't turn curl into Invoke-WebRequest无法将 curl 转换为 Invoke-WebRequest
【发布时间】:2014-05-12 14:35:30
【问题描述】:

我有一个很好用的 curl 命令,我正在尝试将其转换为 PowerShell Invoke-WebRequest 调用。

这是带有多部分 POST 数据的 工作 curl:

curl -X POST "http://domain.com/admin/batchOrder/processBatch" 
 -F "ordersFile=@c:\temp\Sample_Auto_Order_Input_File.xml" 
 -F "psid=3002010250764" 
 -F "recipients[0]=astraljack@example.com"

这就是我试图通过Invoke-WebRequest 实现的地方。根据我读过的内容,我需要创建一个名称-值对的哈希表。我觉得我应该像上面的多部分 POST 数据一样创建哈希表。

$form.clear()
$form.Add("ordersFile", "c:\temp\Sample_Auto_Order_Input_File.xml")
$form.Add("psid", "3002010250764")
$form.Add("recipients[0]", "astraljack@example.com")
$form

然后我可以调用 Invoke-WebRequest。

Invoke-WebRequest http://domain.com/admin/batchOrder/processBatch -Body $form -Method Post

这会失败并返回 400 错误请求。需要明确的是,我从来没有让这个 Invoke-WebRequest 工作,所以我可能会离开这里。我什至不确定在哪里可以找到更好的错误消息。

如果有帮助,异常的内容是

IsMutuallyAuthenticated : False
Cookies                 : {}
Headers                 : {Connection, Transfer-Encoding, Content-Type, Date...}
SupportsHeaders         : True
ContentLength           : -1
ContentEncoding         : 
ContentType             : application/json;charset=UTF-8
CharacterSet            : UTF-8
Server                  : Apache
LastModified            : 5/12/2014 10:23:19 AM
StatusCode              : BadRequest
StatusDescription       : Bad Request
ProtocolVersion         : 1.1
ResponseUri             : http://domain.com/admin/batchOrder/processBatch
Method                  : POST
IsFromCache             : False

【问题讨论】:

    标签: powershell curl


    【解决方案1】:

    解决问题的最佳方法是下载 Fiddler,然后捕获 CURL 请求。检查其 RAW 请求。然后对 Invoke-WebRequest 命令执行相同的操作。看看有什么不同,这应该会告诉您需要使用 Invoke-WebRequest 进行哪些调整。

    【讨论】:

      【解决方案2】:

      curl 中的@filepath 语法实际上将文件的内容读入参数,但在您的 PowerShell 版本中,您只是将 ordersFile 的值设置为文件名。试试:

      $form.clear()
      $form.Add("ordersFile", (get-content "c:\temp\Sample_Auto_Order_Input_File.xml"))
      $form.Add("psid", "3002010250764")
      $form.Add("recipients[0]", "astraljack@example.com")
      $form
      

      此外,您可能需要将-ContentType "application/x-www-form-urlencoded" 添加到您的 Invoke-WebRequest 调用中。 `

      【讨论】:

        【解决方案3】:

        我知道这是一个老问题,但我想既然它仍然没有答案,我会投入两分钱。我会这样做:

        $form = @{
            'ordersFile' = 'c:\temp\Sample_Auto_Order_Input_File.xml'
            'psid' = '3002010250764'
            'recipients[0]' = 'astraljack@example.com'
        }
        
        Invoke-WebRequest -Uri "http://domain.com/admin/batchOrder/processBatch" -Body $form -Method Post
        

        【讨论】:

          猜你喜欢
          • 2018-02-02
          • 2018-08-30
          • 2020-02-28
          • 2017-12-12
          • 2020-10-14
          • 2017-11-30
          • 1970-01-01
          • 2020-03-17
          • 2019-01-02
          相关资源
          最近更新 更多