1

我正在尝试通过那里的 API 从 Mixpanel 请求数据。

Mixpanel JQL 入门

我可以运行他们的基本示例脚本的修改版本并接收数据。

# 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上面是查询负载,其中包含一个运行在 Mixpanel 服务器上的 JS 函数。请求返回 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?

4

1 回答 1

0

根据 Jeroen Mostert 的评论,这最终奏效了:

$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 也会导致成功

于 2019-09-23T14:01:49.570 回答