Powershell Core Invoke-RestMethod, дающий неожиданный символ ('M' (код 77)): ожидаемое допустимое значение - PullRequest
0 голосов
/ 03 марта 2019

Это сводит меня с ума. Я провел последние несколько дней, пытаясь найти ответы на форумах, но не видел ничего, что могло бы помочь мне здесь.Может быть, я просто слепой.

Вот моя проблема.Я пытаюсь обновить одну из наших страниц Confluence Wiki, используя API, предоставленный для обновления страницы.

У меня есть три сценария или функции:

  1. Развертывание сценария или сценария контроллера, который вызывает Create и с ответом (Json) вызывает Update
  2. Create Confluence Json
  3. Страница обновления

Это функция создания

function Create-WikiPage
 [CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [ValidateNotNullOrEmpty()]
    [int]$CurrentPageRevisionNumber
) 
    # Creates the ID for new page
$NextPageID=$CurrentPageRevisionNumber + 1

# Creates the json body of the Wiki page
$ToolsPage= @{
    "version"= @{
        "number"= $NextPageID
    };
    "title"= "Windows Build Agent Tool Set";
    "type"= "page";
    "body"= @{
        "storage"= @{
            "value"= "<p><table><tr><th>Vendor-Application</th><th>Version</th></tr></table></p>";
            "representation"= "storage"
        }
    }
} | ConvertTo-Json


$ToolsPage
}

Функция обновления выглядит следующим образом:

Update-WikiPage {
[CmdletBinding()]
param(
    [ValidateNotNullOrEmpty()]
    [string]$Server,

    [Parameter(Mandatory)]
    [ValidateNotNullOrEmpty()]
    [string]$Username,

    [ValidateNotNullOrEmpty()]
    [string]$Password,

    [ValidateNotNullOrEmpty()]
    [long]$PageId,

    [Parameter(Mandatory)]
    [ValidateNotNullOrEmpty()]
    $Data
)
[Net.ServicePointManager]::SecurityProtocol = 'Tls12, Tls11'

$Encoded =  [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("$($Username):$Password"))
$Header = @{"Authorization" = "Basic $Encoded"
        }     
Write-Information ($Data | Out-String)
$Data.GetType()

# Updates the Wiki page
Invoke-RestMethod "$($Server)/rest/api/content/$($PageId)" -Method PUT -Headers $Header -ContentType "application/json" -Body $Data -PreserveAuthorizationOnRedirect 
}

Как видите, яполучить распечатку объекта JSon как часть функции обновления.Это распечатка:

    {
  "version": {
    "number": 9
  },
  "body": {
    "storage": {
      "value": "<p><table><tr><th>Vendor-Application</th><th>Version</th></tr></table></p>",
      "representation": "storage"
    }
  },
  "title": "Windows Build Agent Tool Set",
  "type": "page"
}

И это ошибка PowerShell, которую я получаю:

VERBOSE: received -byte response of content type application/json
Invoke-RestMethod : {"statusCode":500,"message":"org.codehaus.jackson.JsonParseException: Unexpected character ('M' (code 77)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')\n at [Source: com.atlassian.confluence.plugins.restapi.filters.LimitingRequestFilter$1@6b6831ec; line: 1, column: 2]"}
At C:\Users\ChildsC\Documents\Git\PowerShellModules\Wiki\Update-WikiPage.ps1:65 char:2
+     Invoke-RestMethod "$($Server)/rest/api/content/$($PageId)" -Metho ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (Method: PUT, Re...ication/json
}:HttpRequestMessage) [Invoke-RestMethod], HttpResponseException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

РЕДАКТИРОВАТЬ

Я заметил, чтоЭта проблема возникает, когда я передаю объект json из Create Json -> Deploy -> Update, если я создаю json в сценарии Deploy и передаю его в Update, он работает без проблем.

1 Ответ

0 голосов
/ 04 марта 2019

Хорошо

Так что для этого оказывается, что я был идиотом.И никто другой не увидит проблему, потому что я не опубликовал полный скрипт.

Ранее в функции Create у меня была строка для отправки параметров в консоль:

$PsBoundParameters | Out-String

Итаккогда я думал, что скрипт возвращает только значение $ ToolsPage, он на самом деле также возвращает другой объект с ним.

Поэтому причина, по которой сценарий обновления заключается в том, что я явно передаю переменную $ ToolsPage.

Я выяснил это, установив Параметры, которые должны содержать значение объекта в $ Global: variable_name, а затем сравнил значения из моей консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...