Перевод запроса Curl в Invoke-WebRequest с параметром --data-urlencode - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь запросить данные у Mixpanel через там API.

Mixpanel JQL Getting Started

Я могу запустить модифицированную версию своего базового примера сценария и получать данные.

# sends the JQL code in `query.js` to the api
# to a project with sample data for this tutorial
curl https://mixpanel.com/api/2.0/jql \
    -u API_SECRET:PASSWORD \
    --data-urlencode script@query.js

query.js вышеэто полезная нагрузка запроса, которая содержит функцию JS, которая выполняется на серверах Mixpanel.Запрос возвращает данные JSON.

Мне не удалось перевести это в Invoke-WebRequest.Ниже моя попытка.

$urlEncodedString = gc query.js | Out-String | % {[System.Web.HttpUtility]::UrlEncode($_)}
$user = 'SECRET'; 
$pass = 'PASSWORD';  
$pair = "$($user):$($pass)";  
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair));
$basicAuthValue = "Basic $encodedCreds";
$Headers = @{ Authorization = $basicAuthValue };

Invoke-WebRequest -Uri ("https://mixpanel.com/api/2.0/jql") -Headers $Headers -Method Post -Body "Script@$urlEncodedString

Возвращает 400 с сервера.Если я использую многословно, размер полезной нагрузки будет отображаться как -1 байт.

Аутентификация правильная, но я уверен, что неправильно размещаю "script @ $ urlEncodedString".

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

Как перевести часть --data-urlencode в Invoke-WebRequest?

1 Ответ

0 голосов
/ 23 сентября 2019

Основываясь на комментарии Джероена Мостерта, это сработало:

$query = gc query.js | Out-String 
$user = 'SECRET'; 
$pass = 'PASSWORD';  
$pair = "$($user):$($pass)";  
$encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair));
$basicAuthValue = "Basic $encodedCreds";
$Headers = @{ Authorization = $basicAuthValue };

Invoke-WebRequest -Uri ("https://mixpanel.com/api/2.0/jql") -Headers $Headers -Method Post -Body @{"script" = $query}

Как ни странно, gc query.js было недостаточно для получения правильного ответа от Mixpanel.

Редактировать: Out-String возвращает одну строку по умолчанию, где Get-Content возвращает список строк на строку по умолчанию.Вот почему включение Out-String привело к успешному запросу.

Get-Content --raw также приводит к успеху

...