无法将curl转换为Invoke-WebRequest

时间:2014-05-12 14:35:30

标签: powershell curl

我有一个很好用的curl命令,我试图把它变成PowerShell Invoke-WebRequest来电。

以下是使用多部分POST数据的工作卷曲:

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 Bad Request 而失败。为了清楚起见,我永远不会让这个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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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调用中。 `

答案 2 :(得分:0)

我知道这是一个老问题,但我想,因为它仍然没有答案,我会投入我的两分钱。以下是我将如何做到这一点:

$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