使用PowerShell Invoke-RestMethod发布多部分正文



使用Postman API调用工作。我使用了他们的代码片段特性来获得PowerShell的等效物。但是当我在PowerShell ISE上尝试时,我得到"空请求体不允许"。为什么它认为身体是空的?我如何确认/查看$body的内容?

using assembly System.Net.Http
using namespace System.Net.Http
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization", "Bearer token")
$multipartContent = [System.Net.Http.MultipartFormDataContent]::new()
$multipartFile = 'C:UsersxxxDesktopmsg.json'
$FileStream = [System.IO.FileStream]::new($multipartFile, [System.IO.FileMode]::Open)
$fileHeader = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("form-data")
$fileHeader.Name = "ParameterRequest"
$fileContent = [System.Net.Http.StreamContent]::new($FileStream)
$fileContent.Headers.ContentDisposition = $fileHeader
$multipartContent.Add($fileContent)
$FileStream.Flush()
$FileStream.Close()
$multipartFile = 'C:UsersxxxDesktopedm_payload'
$FileStream = [System.IO.FileStream]::new($multipartFile, [System.IO.FileMode]::Open)
$fileHeader = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("form-data")
$fileHeader.Name = "MessagePayload"
$fileContent = [System.Net.Http.StreamContent]::new($FileStream)
$fileContent.Headers.ContentDisposition = $fileHeader
$multipartContent.Add($fileContent)
$FileStream.Flush()
$FileStream.Close()
$body = $multipartContent
$response = Invoke-RestMethod -Method Post -Uri 'https://APIsite' -Headers $headers -Body $body -ContentType "multipart/form-data"

当我看$body的内容时,这就是我得到的。如何查看每个Content中的数据?

PS C:Usersuser> $body
Headers                                 
-------                                 
{[Content-Disposition, System.String[]]}
{[Content-Disposition, System.String[]]}

-Verbose添加到Invoke-RestMethod,我看到

VERBOSE: POST https://APIsite with -1-byte payload

我找不到"-1字节的有效负载"是什么意思。有人知道吗?

解决。部分问题是我使用的是PowerShell v5,从那以后MultipartFormDataContent得到了改进。更新到PowerShell的7版,做了一些调整…成功!

$formContent = New-Object -TypeName 'System.Net.Http.MultipartFormDataContent'
$filePath = "C:UsersxxxDesktopmsg.json"
$fileStream1 = [System.IO.File]::Open($filePath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)
$formContent.Add([System.Net.Http.StreamContent]::new($fileStream1), "ParameterRequest", (Split-Path $filePath -leaf))
$filePath = "C:UsersxxxDesktopedm_payload"
$fileStream2 = [System.IO.File]::Open($filePath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)
$formContent.Add([System.Net.Http.StreamContent]::new($fileStream2), "MessagePayload", (Split-Path $filePath -leaf))
Invoke-RestMethod -Method Post -Uri 'https://APIsite' -Headers $requestHeader -Body $formContent -ContentType 'multipart/form-data'
在之后关闭你的流API调用

最新更新