尝试使用 powershell 进行 Rest 调用 (PUT)
trying to make an Rest call (PUT) with powershell
我正在尝试通过 canvas api 更改课程代码。我可以在 bash 中使用 give
示例
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,进行 PUT 调用时必须选择 multipart/form-data。
假设 Canvas 有一个 REST 接口,Invoke-RestMethod
cmdlet 可能比 Invoke-WebRequest
更适合。
我记得,Invoke-WebRequest 是为网页设计的,包括处理 HTML 响应的功能,它 returns 是一个有点倾斜的对象,而 Invoke- RestMethod 适用于 Web API,并以不同方式处理响应。这种对响应的替代处理可能有助于了解您正在发生的事情。
有关详细信息,请参见示例 https://www.systemcenterautomation.com/2018/05/invoke-restmethod-vs-invoke-webrequest/
问题是我使用了错误的内容类型。对于 Canvas LMS,进行 PUT 调用时必须选择 multipart/form-data。
我注意到的一件事是,是的 - 您必须使用“-ContentType 'multipart/form-data'”开关,但我还发现 BODY 不应包含 JSON 对象。相反,您在 BODY 字段中传递一个 Powershell 哈希表,如下所示:
$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
我正在尝试通过 canvas api 更改课程代码。我可以在 bash 中使用 give
示例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,进行 PUT 调用时必须选择 multipart/form-data。
假设 Canvas 有一个 REST 接口,Invoke-RestMethod
cmdlet 可能比 Invoke-WebRequest
更适合。
我记得,Invoke-WebRequest 是为网页设计的,包括处理 HTML 响应的功能,它 returns 是一个有点倾斜的对象,而 Invoke- RestMethod 适用于 Web API,并以不同方式处理响应。这种对响应的替代处理可能有助于了解您正在发生的事情。
有关详细信息,请参见示例 https://www.systemcenterautomation.com/2018/05/invoke-restmethod-vs-invoke-webrequest/
问题是我使用了错误的内容类型。对于 Canvas LMS,进行 PUT 调用时必须选择 multipart/form-data。
我注意到的一件事是,是的 - 您必须使用“-ContentType 'multipart/form-data'”开关,但我还发现 BODY 不应包含 JSON 对象。相反,您在 BODY 字段中传递一个 Powershell 哈希表,如下所示:
$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