使用 --data-urlencode 参数将 Curl 请求转换为 Invoke-WebRequest

Translating Curl request to Invoke-WebRequest with --data-urlencode parameter

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

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是query payload,里面包含一个JS函数,在Mixpanel服务器上是运行。请求 returns JSON data.

我无法将其转换为 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

Returns 来自服务器的 400。 如果我使用详细,有效负载大小显示为 -1 字节。

身份验证正确,但我确定我没有正确放置 "script@$urlEncodedString"。

我试过将正文构建为字典,但也没有成功。我在详细模式下收到相同的错误和消息。

如何将 --data-urlencode 部分转换为 Invoke-WebRequest?

基于 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 returns 单个字符串,其中 Get-Content returns 默认情况下每行的字符串列表。这就是包含 Out-String 导致请求成功的原因。

Get-Content --raw 也会导致成功