Ошибка 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, который упрощает эту задачу. Ознакомьтесь с инструкциями по использованию здесь.