使用 --data-urlencode 参数将 Curl 请求转换为 Invoke-WebRequest
Translating Curl request to Invoke-WebRequest with --data-urlencode parameter
我正在尝试通过 API 从 Mixpanel 请求数据。
我可以运行他们的基本示例脚本的修改版本并接收数据。
# 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 也会导致成功
我正在尝试通过 API 从 Mixpanel 请求数据。
我可以运行他们的基本示例脚本的修改版本并接收数据。
# 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 也会导致成功