【问题标题】:Post multi-part body with PowerShell Invoke-RestMethod使用 PowerShell Invoke-RestMethod 发布多部分正文
【发布时间】:2021-02-12 20:19:19
【问题描述】:

使用 Postman 调用 API 即可。我使用他们的代码 sn-p 功能来获得 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[]]}

Invoke-RestMethod 中添加了-Verbose,我明白了

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

我找不到“-1 字节有效负载”的含义。有人知道吗?

【问题讨论】:

  • 要回答有关如何检查 $body 变量内容的问题,在 Powershell ISE 中,您可以通过按 F9 在行上设置断点。将在光标所在的任何行上设置断点。然后,当您运行脚本时,代码将在该行暂停执行,您可以检查脚本中该点处任何变量的状态。您可以通过将鼠标悬停在编辑器中的变量上,甚至在控制台中键入变量并按 Enter 来执行此操作。这称为调试。
  • 查看page 了解更多关于如何使用 ISE 调试器的信息。

标签: powershell rest invoke-restmethod


【解决方案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.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 调用之后关闭您的流

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    相关资源
    最近更新 更多