Invoke-RestMethod для отправки CSV - PullRequest
1 голос
/ 25 октября 2019

Я понимаю, что на этот вопрос задавали и отвечали много раз, но я получаю сообщение об ошибке, которого я не видел на форумах, и я надеюсь, что кто-то может знать, что я делаю неправильно.

Итак, что я делаю? Я использую Expensify API для автоматизации предоставления новых сотрудников. У меня уже есть новый сценарий найма на 2000 строк, и я просто пытаюсь добавить в него больше приложений SaaS, поэтому мне нужно сделать ... меньше.

Предполагается, что запрос cURL будет выглядеть следующим образом:

curl -X POST 'https://integrations.expensify.com/Integration-Server/ExpensifyIntegrations' \
-H 'Expect:' \
-F 'requestJobDescription={
    "type": "update",
    "credentials": {
        "partnerUserID": "_REPLACE_",
        "partnerUserSecret": "_REPLACE_"
    },
    "inputSettings": {
        "type": "employees",
        "policyID":"0123456789ABCDEF",
        "fileType": "csv"
    }
}' \
-F 'data=@employeeData.csv'

И мой скрипт выглядит так:

$expensify_csv = @(
    [pscustomobject]@{
    EmployeeEmail = $email
    ManagerEmail  = $mngr_email
    Admin  = $expensify_admin
    ForwardManagerEmail = $fwd_email
    }
) | Export-Csv -Path C:\expensify.csv -NoTypeInformation

$expensify_csv = [IO.File]::ReadAllText('C:\expensify.csv');

$json = [ordered]@{
    "requestJobDescription" = @{
        "type" = "update";
        "credentials" = @{
            "partnerUserID" = $expensify_id;
            "partnerUserSecret" = $expensify_secret;
        }
        "inputSettings" = @{
            "type" = "employees";
            "policyID" = "F9CC59BCD4521BB2";
            "fileType" = "csv";
        }
    };
    "data" = $expensify_csv
} | ConvertTo-Json -Depth 10

Write-Host $json

$check = Invoke-RestMethod `
    -Method Post `
    -Uri $expensify_url `
    -Body $json `
    -ContentType multipart/form-data `

Write-Host $check

exit

И возвращаемая ошибка:

Invoke-RestMethod :

        Error

            body{
                font-family: Arial;
            }
            pre{
                padding: 5px;
                background-color: #ddd;
                border-top: 2px solid #999;
            }



        An error occurred
        Internal Server Error

Похоже, ошибка связана сCSS? Я понятия не имею, хотя. Очень странно. Я уже давно борюсь с этим API и буду признателен за любые отзывы!

1 Ответ

0 голосов
/ 26 октября 2019

ОБНОВЛЕНО

Теперь я вижу, в чем проблема, curl имеет это -F, чтобы добавить еще один запрос в body, и curl делает некоторые дополнительные правки в фоновом режиме,как добавление boundary. Это не является родным для Invoke-RestMethod, поэтому нам нужно написать его.

$FilePath = 'C:\employeeData.csv';
$URL = 'https://integrations.expensify.com/Integration-Server/ExpensifyIntegrations';

$importedCSV = Get-Content $filepath -Raw
$boundary = [System.Guid]::NewGuid().ToString(); 
$LF = "`r`n";

$bodyhash = [ordered]@{
    "type" = "update";
    "credentials" = @{
        "partnerUserID" = "_REPLACE_";
        "partnerUserSecret" = "_REPLACE_";
    }
    "inputSettings" = @{
        "type" = "employees";
        "policyID" = "F9CC59BCD4521BB2";
        "fileType" = "csv";
    }
} 

$bodyJSON = $bodyhash | ConvertTo-Json

$nestedBody = ( 
    "--$boundary",
    "Content-Disposition: form-data; name=`"requestJobDescription`"",
    "Content-Type: application/json$LF",
    "$($bodyJSON)",
    "--$boundary",
    "Content-Disposition: form-data; name=`"data`"; filename=`"employeeData.csv`"",
    "Content-Type: application/octet-stream$LF",
    $importedCSV,
    "--$boundary--$LF" 
) -join $LF

$sendRequest=@{
    Uri = $URL 
    Method = "Post"
    ContentType = "multipart/form-data; boundary=`"$boundary`""
    Body = $nestedBody
}

Invoke-RestMethod @sendRequest

Этот пример дает мне Authentication Error, как я и ожидал, в отличие от ранее с internal server error.

2 ответа (не принятые) из следующего поста приводят меня к этому решению - powershell invoke-restmethod multipart / form-data

PS Работа над этой проблемой ведет крешение по моей собственной проблеме о том, как сделать nested HTTP request с powershell.

...