Saltar al contenido

Cómo enviar datos de varias partes/formularios con PowerShell Invoke-RestMethod

Tenemos la contestación a esta incógnita, o por lo menos eso pensamos. Si tienes preguntas déjanoslo saber en un comentario, para nosotros será un placer responderte

Solución:

La respuesta aceptada no hará un multipart/form-data petición, sino más bien una application/x-www-form-urlencoded solicitud de obligar a la Content-Type encabezado a un valor que el cuerpo no contiene.

Una forma de enviar un multipart/form-data solicitud formateada con PowerShell es:

$ErrorActionPreference = 'Stop'

$fieldName = 'file'
$filePath = 'C:Temptest.pdf'
$url = 'http://posttestserver.com/post.php'

Try 
    Add-Type -AssemblyName 'System.Net.Http'

    $client = New-Object System.Net.Http.HttpClient
    $content = New-Object System.Net.Http.MultipartFormDataContent
    $fileStream = [System.IO.File]::OpenRead($filePath)
    $fileName = [System.IO.Path]::GetFileName($filePath)
    $fileContent = New-Object System.Net.Http.StreamContent($fileStream)
    $content.Add($fileContent, $fieldName, $fileName)

    $result = $client.PostAsync($url, $content).Result
    $result.EnsureSuccessStatusCode()

Catch 
    Write-Error $_
    exit 1

Finally 
    if ($client -ne $null)  $client.Dispose() 
    if ($content -ne $null)  $content.Dispose() 
    if ($fileStream -ne $null)  $fileStream.Dispose() 
    if ($fileContent -ne $null)  $fileContent.Dispose() 

El problema aquí era que la API requería algunos parámetros adicionales. La solicitud inicial requería algunos parámetros para aceptar contenido sin procesar y especificar el nombre/tamaño del archivo. Después de configurar eso y recuperar el enlace adecuado para enviar, pude usar:

Invoke-RestMethod -Uri $uri -Method Post -InFile $filePath -ContentType "multipart/form-data"

Encontré este post y lo cambié un poco.

$fileName = "..."
$uri = "..."

$currentPath = Convert-Path .
$filePath="$currentPath$fileName"

$fileBin = [System.IO.File]::ReadAlltext($filePath)
$boundary = [System.Guid]::NewGuid().ToString()
$LF = "`r`n"
$bodyLines = (
    "--$boundary",
    "Content-Disposition: form-data; name=`"file`"; filename=`"$fileName`"",
    "Content-Type: application/octet-stream$LF",
    $fileBin,
    "--$boundary--$LF"
) -join $LF

Invoke-RestMethod -Uri $uri -Method Post -ContentType "multipart/form-data; boundary=`"$boundary`"" -Body $bodyLines

Sección de Reseñas y Valoraciones

Si eres capaz, tienes el poder dejar un enunciado acerca de qué le añadirías a este escrito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *