正在尝试使用powershell进行Rest调用(PUT)

正在尝试使用powershell进行Rest调用(PUT),powershell,curl,canvas-lms,invoke-webrequest,Powershell,Curl,Canvas Lms,Invoke Webrequest,我试图通过canvas 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中复制这个。电话接通了,但没有

我试图通过canvas 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"
以前有人有过这个问题吗?我的代码中有什么地方我做错了吗?我无法复制我在卷曲中所能做的

解决了


问题是我使用了错误的内容类型。对于Canvas LMS,在执行PUT调用时必须选择多部分/表单数据。

假设Canvas具有REST接口,则Invoke-RestMethod cmdlet可能比Invoke-WebRequest更适合于此

我记得,Invoke WebRequest是针对web页面的,它包括处理HTML响应的功能,它返回一个有点倾斜的对象,而Invoke RestMethod是针对web API的,并以不同的方式处理响应。这种对响应的替代性处理可能有助于了解发生了什么


有关更多详细信息,请参见示例

问题在于我使用了错误的内容类型。对于Canvas LMS,在执行PUT调用时必须选择多部分/表单数据。

我注意到的一件事是,是的-您必须使用-ContentType“multipart/form data”开关,但我还发现主体不应包含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

curl和PS示例之间有不同的url,curl命令中有硬编码标记,但PS示例中没有。如果您在PS脚本中硬编码令牌,是否有效?如果你使用相同的URL呢?尝试了这两种方法当你说呼叫通过时,你的意思是你从Web服务器得到相同的响应吗?您是否尝试捕获两个请求并进行比较以确保它们完全相同?您是否使用自签名证书?和或powershell版本3-5,如果是这样的话,您可能想看看这篇文章:您可以使用类似Fiddler的东西来捕获请求和响应Invoke WebRequest做同样的事情。我还想说,任何一种方法都适用于GET和POST方法。似乎只要我使用PUT方法,我就会遇到这个麻烦。