использование Invoke-RestMethod для публикации на cosmosDB Возвращает 400 - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь опубликовать документ на cosmosdb с помощью powershell, я выполнил действия, описанные в этом сообщении 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)

возвращает 400каждый раз я не уверен, что не так с запросом.

Ответы [ 2 ]

1 голос
/ 25 октября 2019

На основании примеров сценариев Powershell я вижу, что вам не хватает заголовков:

  • x-ms-documentdb-partitionkey
  • User-Agent
  • 2018-12-31 как x-ms-версия

Добавление тела ответа, которое вы получаете, также поможет.

0 голосов
/ 30 октября 2019

это работает сейчас

Я не уверен, почему я получил 400. Возможно, время, когда я создавал коллекцию, было выключено.

...