curl转PowerShell Invoke-RestMethod调用API报无效凭据错误排查
问题原因
不需要拆分所有API路径参数,报错的核心原因是URL里的XML特殊字符未做正确编码:
cmd参数值里的<、>属于URL规范里的保留字符,必须做百分号编码才能正常在Query参数中传输- Ubuntu环境下的
curl会自动对传入URL中的非法保留字符做隐式转码,所以请求能正常被服务端解析 - PowerShell(尤其是Windows PowerShell 5.1版本)的
Invoke-RestMethod不会自动处理硬编码在Uri字符串里的未编码保留字符,实际发送请求时会出现参数截断、解析错位的问题,服务端收不到完整的API key或参数结构,最终返回Invalid Credential错误。
修复方案
选任意一种方式即可:
- 手动编码特殊参数(兼容所有PowerShell版本)
用[Uri]::EscapeDataString()方法单独对包含特殊字符的参数值做编码,再拼接成完整请求地址:$apiKey = "LUFRPTxxxxx" # 对XML格式的cmd参数做URL编码 $cmdContent = [Uri]::EscapeDataString("<commit><partial><admin><member>USERNAME</member></admin></partial></commit>") $requestUri = "https://panorama.domain.com/api/?key=$apiKey&type=commit&action=partial&cmd=$cmdContent" Invoke-RestMethod -Method GET -Uri $requestUri -Verbose - 用哈希表传参自动编码(适合PowerShell 7+版本)
直接把所有Query参数以哈希表形式传给-Body参数,PowerShell会自动完成所有参数的URL编码,不需要手动处理特殊字符:$queryArgs = @{ key = "LUFRPTxxxxx" type = "commit" action = "partial" cmd = "<commit><partial><admin><member>USERNAME</member></admin></partial></commit>" } Invoke-RestMethod -Method GET -Uri "https://panorama.domain.com/api/" -Body $queryArgs -Verbose
注意:普通无特殊字符的参数不需要单独拆分处理,只有包含URL保留字符(
<、>、&、=、空格、中文等)的参数值需要做编码,单独传参的方式只是更不容易出现转义类问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

