使用 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:\Users\xxx\Desktop\msg.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:\Users\xxx\Desktop\edm_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内容时,这就是我所得到的。如何查看每个内容中的数据?

PS C:\Users\user> $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:\Users\xxx\Desktop\msg.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:\Users\xxx\Desktop\edm_payload"
$fileStream2 = [System.IO.File]::Open($filePath,[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 调用之后关闭您的流

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...