使用 Invoke-RestMethod post 到 cosmosDB Returns a 400

using Invoke-RestMethod to post to a cosmosDB Returns a 400

我正在尝试 post 使用 powershell 将文档发送到 cosmosdb,我已按照此 post https://www.systemcenterautomation.com/2018/06/cosmos-db-rest-api-powershell/ 中的步骤进行操作,但每次仍然收到 400 错误

Add-Type -AssemblyName System.Web

# generate authorization key
Function Generate-MasterKeyAuthorizationSignature
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true)][String]$verb,
        [Parameter(Mandatory=$true)][String]$resourceLink,
        [Parameter(Mandatory=$true)][String]$resourceType,
        [Parameter(Mandatory=$true)][String]$dateTime,
        [Parameter(Mandatory=$true)][String]$key,
        [Parameter(Mandatory=$true)][String]$keyType,
        [Parameter(Mandatory=$true)][String]$tokenVersion
    )

    $hmacSha256 = New-Object System.Security.Cryptography.HMACSHA256
    $hmacSha256.Key = [System.Convert]::FromBase64String($key)

    $payLoad = "$($verb.ToLowerInvariant())`n$($resourceType.ToLowerInvariant())`n$resourceLink`n$($dateTime.ToLowerInvariant())`n`n"
    $hashPayLoad = $hmacSha256.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($payLoad))
    $signature = [System.Convert]::ToBase64String($hashPayLoad);

    [System.Web.HttpUtility]::UrlEncode("type=$keyType&ver=$tokenVersion&sig=$signature")
} 


Function Post-CosmosDocuments{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true)][String]$EndPoint,
        [Parameter(Mandatory=$true)][String]$DBName,
        [Parameter(Mandatory=$true)][String]$CollectionName,
        [Parameter(Mandatory=$true)][String]$MasterKey,
        [String]$Verb="POST",
        [Parameter(Mandatory=$true)][String]$JSON
    )
    $Verb = "POST"
    $ResourceType = "docs";
    $ResourceLink = "dbs/$DBName/colls/$CollectionName"

    $dateTime = [DateTime]::UtcNow.ToString("r")
    $authHeader = Generate-MasterKeyAuthorizationSignature -verb $Verb -resourceLink $ResourceLink -resourceType $ResourceType -key $MasterKey -keyType "master" -tokenVersion "1.0" -dateTime $dateTime
    $header = @{authorization=$authHeader;"x-ms-version"="2017-02-22";"x-ms-date"=$dateTime}
    $contentType= "application/json"
    $queryUri = "$EndPoint$ResourceLink/docs"

    $result = Invoke-RestMethod -Method $Verb -ContentType $contentType -Uri $queryUri -Headers $header -Body $JSON
    return $result.statuscode
} 


$CosmosDBEndPoint = "https://<omitted>.documents.azure.com:443/"
$DBName = "database"
$CollectionName = "container"
$MasterKey = "<omitted>=="

$SomeObject = [PSObject]@{ id = 1 ; Application = "Ops"; Environment = "Dev"; adKey = "555-555-5555"; } 
Post-CosmosDocuments -EndPoint $CosmosDBEndPoint -MasterKey $MasterKey -DBName $DBName -CollectionName $CollectionName -JSON ($SomeObject | ConvertTo-Json)

returns每次都是400,不知道请求有什么问题。

根据 Powershell script samples,我发现您缺少 headers:

  • x-ms-documentdb-partitionkey
  • User-Agent
  • 2018-12-31 为 x-ms-version

添加您收到的回复 body 也会有所帮助。

它正在工作

我不确定为什么我得到了 400。也许我创建 collection 的时间不对。