powershell - 无法将 JSON 流数据引入 Azure 事件中心
问题描述
我想将从 API 端点获得的 JSON 结果发布到 Azure 事件中心 $default 消费者组,但我收到以下错误:
Invoke-RestMethod : The remote server returned an error: (401) Unauthorized.
At H:\Users\User1 - scripts\get_mel_streetparking_data.ps1:34 char:1
+ Invoke-RestMethod -Uri $URI -Method $method -Headers $headers -Body $res ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke- RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
我编写了以下一段 powershell 脚本,其中以下一段 get 代码运行良好:
$url = "https://data.melbourne.vic.gov.au/resource/vh2v-4nfs"
$apptoken = "abcdasdadaaf"
# Set header to accept JSON
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Accept","application/json")
$headers.Add("X-App-Token",$apptoken)
$results = Invoke-RestMethod -Uri $url -Method get -Headers $headers
但下面的一段代码失败并出现上述错误:
$method = "POST"
$URI = "https://[servicebusNamespace].servicebus.windows.net/[eventHubPath]/messages"
$signature = "SharedAccessSignature sr=[servicebusNamespace].servicebus.windows.net%2feventhub- streetparking&sig=%3dgZfDHEGN8lVEGgqu4N64TW70BLuSKARSKgMPeRByc%5d&se=604985&skn=RootManageSharedAccessKe"
# API headers
$headers = @{
"Authorization"=$signature;
"Content-Type"="application/json";
}
# create Request Body
#$body = "$results"
# execute the Azure REST API
Invoke-RestMethod -Uri $URI -Method $method -Headers $headers -Body $results
我在以下代码的帮助下生成了 SAS 令牌:
[Reflection.Assembly]::LoadWithPartialName("System.Web")| out-null
$URI="[servicebusNamespace].servicebus.windows.net/[eventHubPath]"
$Access_Policy_Name="RootManageSharedAccessKey"
$Access_Policy_Key="Root key value"
#Token expires now+3000
$Expires=([DateTimeOffset]::Now.ToUnixTimeSeconds())+3000
$SignatureString=[System.Web.HttpUtility]::UrlEncode($URI)+ "`n" + [string]$Expires
$HMAC = New-Object System.Security.Cryptography.HMACSHA256
$HMAC.key = [Text.Encoding]::ASCII.GetBytes($Access_Policy_Key)
$Signature = $HMAC.ComputeHash([Text.Encoding]::ASCII.GetBytes($SignatureString))
$Signature = [Convert]::ToBase64String($Signature)
$SASToken = "SharedAccessSignature sr=" + [System.Web.HttpUtility]::UrlEncode($URI) + "&sig=" + [System.Web.HttpUtility]::UrlEncode($Signature) + "&se=" + $Expires + "&skn=" + $Access_Policy_Name
$SASToken
请帮助我为什么我看到未经授权的错误
解决方案
在 SAS 令牌生成之前我没有替换以下值是我的错。
$Access_Policy_Name="RootManageSharedAccessKey" $Access_Policy_Key="根密钥值"
推荐阅读
- regex - 忽略 ansible 正则表达式中的新行
- azure - 在 Azure 中使用来自 IOT Hub 的数据进行查询的问题
- java - 嵌入式 SWT 组未填充所有水平空间
- ruby-on-rails - Rails 6 Nginx 反向代理:提供静态文件的问题
- python - 无法安装 python-dotenv
- php - PHPUnit 断言两个多维数组相等,但顺序不重要
- mongodb - MongoDB 按字母顺序对输出进行排序(分组后)
- mongodb - MongoDB 查找参考(反向)
- ruby-on-rails - 如何通过子对象传播参数?(轨道 5.2)
- c# - 将 Asp.Net Core 3.1 应用程序升级到 .Net 5 后,某些 C# 9 功能不可用