使用Invoke-RestMethod调用含反斜杠的REST API URL报错
解决Invoke-RestMethod返回404未找到的问题
这个404错误大概率是URL编码重复导致的,我帮你拆解问题并给出解决办法:
首先看你用的URL:https://foo/accounts/thing%5CBSTNTZ-MTRFKR,其中%5C是反斜杠\的标准URL编码。但PowerShell的Invoke-RestMethod在处理字符串类型的-Uri参数时,会自动对特殊字符进行编码——这就导致已经编码过的%5C被再次编码成%255C,服务器收到的实际请求路径变成了/accounts/thing%255CBSTNTZ-MTRFKR,自然找不到对应的资源,返回404。
下面是几种可行的解决方式:
方式一:使用未编码的原始路径,让PowerShell自动处理编码
把URL里的%5C替换成实际的反斜杠\,直接传入-Uri参数即可,PowerShell会帮你正确完成URL编码:$url = 'https://foo/accounts/thing\BSTNTZ-MTRFKR' $request_content_type = 'application/xml' $response_checkout = Invoke-RestMethod ` -Credential $credential ` -Method Get ` -Uri $url ` -ContentType $request_content_type方式二:手动创建Uri对象避免重复编码
如果你必须使用已编码好的URL字符串,可以先把它转换成[Uri]类型的对象,再传给-Uri参数,这样PowerShell就不会再次对其编码:$url = [Uri]::new('https://foo/accounts/thing%5CBSTNTZ-MTRFKR') $request_content_type = 'application/xml' $response_checkout = Invoke-RestMethod ` -Credential $credential ` -Method Get ` -Uri $url ` -ContentType $request_content_type额外的排查方向
- 确认
$credential对应的账号是否有访问该资源的权限:部分服务器会用404来隐藏权限不足的问题,而不是返回403 - 直接在浏览器或者API测试工具里访问这个URL,验证资源本身是否存在,排除服务器端的问题
- 检查
-ContentType是否符合API要求:有些接口对Content-Type的校验很严格,传错可能导致返回404或其他错误
- 确认
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

