Пытается сделать вызов Rest (PUT) с powershell (решено)
Я пытаюсь изменить код курса через холст API. Я могу заставить его работать в Bash с примером дать
curl -X PUT -H 'Authorization: Bearer w3KhVblthisisnottoken5LmhlnUorFM8NJMh0' \
https://school.test.instructure.com/api/v1/courses/9066 \
-d 'course[course_code]=holla!' \
-v
Я пытаюсь воспроизвести это в PowerShell. Звонок проходит, но ничего не делает!
function Update-CanvasCourseName(
[Parameter(Mandatory = $true)][string] $CourseId,
[Parameter(Mandatory = $true)][object] $header,
[Parameter(Mandatory = $true)][string] $url,
[Parameter(Mandatory = $true)][string] $name
){
$uri = "$url$CourseId"
$body = @{"course[course_code]" = $name}
Invoke-WebRequest -Headers $header -Body $body -Method put -Uri $uri
}
$header = @{"Authorization"="Bearer $(C:\PowerShells\decryptText.ps1 -FilePath C:\Credentials\canvasapi.txt)"}
$course = 9066
$url = "https://holyfamily.test.instructure.com/api/v1/courses/"
Update-CanvasCourseName -CourseId $course -header $header -url $url -name "please work"
кто-нибудь имел эту проблему раньше? Есть ли в моем коде что-то, что я делаю неправильно? Я не могу воспроизвести то, что я могу сделать в curl. Пожалуйста помоги!
Решено!
Проблема была в том, что я использовал неправильный тип контента. Для Canvas LMS необходимо выбрать multipart/form-data при выполнении вызова PUT.
2 ответа
Проблема была в том, что я использовал неправильный тип контента. Для Canvas LMS необходимо выбрать multipart/form-data при выполнении вызова PUT.
Предполагая, что Canvas имеет интерфейс REST, Invoke-RestMethod
Командлет может быть более подходящим для этого, чем Invoke-WebRequest
,
Как я помню, Invoke-WebRequest предназначен для веб-страниц и включает в себя функции для работы с ответами HTML, он возвращает объект, который является своего рода наклонным, в то время как Invoke-RestMethod предназначен для веб-API, и обрабатывает ответ по-другому. Эта альтернативная обработка ответа может быть полезна для выяснения того, что происходит для вас.
Для получения дополнительной информации см., Например, https://www.systemcenterautomation.com/2018/05/invoke-restmethod-vs-invoke-webrequest/
Я заметил одну вещь: да - вы должны использовать переключатель "-ContentType 'multipart/form-data'", но я также обнаружил, что BODY не должен содержать объект JSON. Вместо этого вы передаете Powershell HashTable в поле BODY следующим образом:
$token = "<YOUR_TOKEN>"
$headers = @{"Authorization"="Bearer "+$token}
$uri = "https://<YOUR_HOST_NAME>:443/api/v1/courses/<COURSE_ID>"
$body = @{
'course[sis_course_id]'='NEW_ID'
}
$response = Invoke-RestMethod `
-URI $URI `
-Headers $headers `
-Method PUT `
-Body $body `
-ContentType 'multipart/form-data'
Write-host $response