Ошибка 400 неверный запрос при создании события календаря группы в PowerShell с Microsoft Graph API

Я пытаюсь создать событие в календаре в группе Office 365 с помощью powershell.

Это мой первый опыт такого рода программирования, так что извините, если мой вопрос будет очень простым:-)

Сначала я создал простой файл json (calendar.json)

{
  "start":
{
 "dateTime":"2017-03-12T17:00:00.0000000",
 "timeZone":"UTC"
},
"end":
{
 "dateTime":"2017-03-12T17:30:00.0000000",
 "timeZone":"UTC"
},
  "responseStatus": {
    "response": "None"
  },
  "iCalUId": "null",
  "isReminderOn": false,
  "subject": "Test Event created from API"
}

Затем я создаю событие с этими шагами:

Используйте проверенную функцию powershell, которая дает мне токен Add header с этим кодом:

$headers = @{}
$headers.Add('Authorization','Bearer ' + $token.AccessToken)
$headers.Add('Content-Type',"application/json")

Поскольку я начинаю сейчас, я конвертирую файл json в объект, а затем объект в json (я знаю, это довольно глупо, но я сделал это, потому что я не знаю json и как конвертировать без ошибок в коде powershell)

$json = ConvertFrom-Json -InputObject (Gc 'C:\Users\mmangiante\OneDrive - Interactive Media S.p.A\Office 365\calendar.json'-Raw)
$body = ConvertTo-Json $json

Позвоните в Invoke-RestMethod

response = Invoke-RestMethod 'https://graph.microsoft.com/v1.0/groups/768afb0c-bafd-4272-b855-6b317a3a9953/calendar/events' -Method Post -Headers $headers -Body $json

Возвращается 400 неверных запросов.

Это та же ошибка, что и при отправке событий запроса Microsoft Graph, возвращается 400

Учитывая ответ на этот вопрос, я изменил свой код, чтобы вернуть ошибку:

try{$restp=Invoke-RestMethod 'https://graph.microsoft.com/v1.0/groups/768afb0c-bafd-4272-b855-6b317a3a9953/calendar/events' -Method Post -Headers $headers -Body $json
} catch {$err=$_}
$err

как предложено в разделе Как получить тело веб-запроса, который возвратил 400 неверных запросов от Invoke-RestMethod, но я не нашел ничего интересного. Единственное, что я обнаружил, это то, что на момент написания Invoke-RestMethod не возвращал полный ответ, как в этом https://github.com/PowerShell/PowerShell/issues/2193

Я предполагаю, что мой JSON не "хорошо сформирован", но я не знаю почему.

У кого-нибудь есть предложение?

2 ответа

Это форматирование работало для меня в прошлом. Дайте мне знать, если это решит ваши проблемы:

$headers = @{ 
    "Authorization" = ("Bearer {0}" -f $token);
    "Content-Type" = "application/json";
}

$body = @{
    Name1 = 'Value1';
    Name2 = 'Value2';
}

$bodyJSON = $body | ConvertTo-Json

Invoke-RestMethod -Method Post -Uri <API HERE> -Headers $headers -Body $bodyJSON -OutFile $output

Спасибо Шон,

Я попробовал ваше предложение, но без удачи; Я сделал другой тест с 2 другими API и нашел противоречивые результаты. Первый тест - использовать график api, связанный с контактом, создавая контакт, как в https://graph.microsoft.io/en-us/docs/api-reference/v1.0/api/user_post_contacts

Я создал представление PowerShell образца JSON:

$contactbody = @{
    givenName = 'Ciccio';
    surname = 'Patacca';
    emailAddresses = @(
        @{
            address = 'cicciopatacca@cicciociccio.com'
            name = 'Ciccio Patacca'
        }
    )
    businessPhones = (
        '+39 555 123 4567'
    )
}

а затем конвертируется в JSON

$contactbody = $contactbody | ConvertTo-Json

Я извлек из портала Azure идентификатор объекта, связанный с моим пользователем в моей компании, и поэтому я вызываю метод rest:

$response = Invoke-RestMethod 'https://graph.microsoft.com/v1.0/users/e37d2dbe-bdaf-4098-9bb0-03be8c653f7d/contact' -Method Post -Headers $headers -Body $contactbody

Окончательный результат - ошибка 400 неверных запросов. Итак, я попробовал другой пример и повторно использовал некоторый код, полученный из поиска Google. На этот раз я скопировал представление powershell json, как в примере, и преобразовал:

$body = @{"displayName"="ps-blog"; "mailEnabled"=$false; "groupTypes"=@("Unified"); "securityEnabled"=$false; "mailNickname"="ps1" } | ConvertTo-Json

и, как указано в https://graph.microsoft.io/en-us/docs/api-reference/v1.0/api/group_post_groups я вызвал метод rest

$response = Invoke-RestMethod 'https://graph.microsoft.com/v1.0/groups' -Method Post -Headers $headers -Body $body

и это сработало. Поэтому я подумал, что ранее представления PowerShell сэмпла с ошибкой были сформированы неправильно (даже если я их напечатал, они равны сэмплам на графике API); для теста я переписал последний PowerShell тела следующим образом:

$body = @{
    displayName = 'TestGraphGroup';
    mailEnabled = $true;
    groupTypes = @('Unified')
    securityEnabled = $false;
    mailNickname = 'TestGraphGroup'
}

$body = $body | ConvertTo-Json

и вызвал последний метод: он снова заработал.

Итак, где я делаю не так?

Был выпущен новый SDK, который упрощает эту задачу. Ознакомьтесь с инструкциями по использованию здесь.

Другие вопросы по тегам