You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中GET请求成功但DELETE/POST请求返回404问题求助

解决PowerShell调用xMatters API时DELETE/POST返回404的问题

刚踩过类似的API调用坑,结合你的情况咱们一步步排查解决:

核心问题分析

1. 更新请求的方法与端点错误

从xMatters的API逻辑来看,更新订阅应该用PUT方法指向具体的订阅ID端点(/subscriptions/:id),而你当前用POST请求根路径/subscriptions——这个路径一般是用来创建新订阅的,这就是POST返回404的主要原因。

2. DELETE请求缺少必要请求头

Postman会自动添加标准请求头(比如Accept: application/json),但PowerShell的Invoke-WebRequest默认不会带上这类头,导致API无法正确识别请求格式,进而返回404。

修改后的可运行代码

每一步都加了注释,直接替换你的代码试试:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$user = '*********'
$pass = ConvertTo-SecureString '*********' -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $pass
$base = "https://*********.hosted.xmatters.com/api/xm/1"
$subscriptionId = '********uuid***********'
# 统一使用带ID的端点,避免字符串拼接出错
$subscriptionUri = "$base/subscriptions/$subscriptionId"

# 先确认资源存在(GET请求保持不变)
$getResponse = Invoke-WebRequest -Credential $cred -Uri $subscriptionUri -Method GET
Write-Host "GET请求成功,状态码:$($getResponse.StatusCode)"

# 修正DELETE请求:添加Accept头,确保API识别响应格式
try {
    $deleteResponse = Invoke-WebRequest -Credential $cred -Uri $subscriptionUri -Method DELETE -Headers @{
        "Accept" = "application/json"
    }
    Write-Host "DELETE请求成功,状态码:$($deleteResponse.StatusCode)"
} catch {
    Write-Host "DELETE失败:$($_.Exception.Message)"
    # 打印API响应详情,方便进一步排查
    if ($_.Exception.Response) {
        $reader = New-Object System.IO.StreamReader($_.Exception.Response.GetResponseStream())
        Write-Host "API返回内容:$($reader.ReadToEnd())"
    }
}

# 修正更新请求:改用PUT方法,指定JSON转换深度
$payload = @{
 id = $subscriptionId
 description = '**** NEW DESCRIPTION ****'
}
# 指定-Depth避免复杂对象转换时的截断(即使结构简单也建议加上)
$jsonPayload = $payload | ConvertTo-Json -Depth 10

try {
    $updateResponse = Invoke-WebRequest -Credential $cred -Uri $subscriptionUri -Method PUT -Body $jsonPayload -ContentType 'application/json' -Headers @{
        "Accept" = "application/json"
    }
    Write-Host "更新请求成功,状态码:$($updateResponse.StatusCode)"
} catch {
    Write-Host "更新失败:$($_.Exception.Message)"
    if ($_.Exception.Response) {
        $reader = New-Object System.IO.StreamReader($_.Exception.Response.GetResponseStream())
        Write-Host "API返回内容:$($reader.ReadToEnd())"
    }
}

额外排查技巧

如果上面的修改还没解决问题,试试这几个方向:

  • 检查URL编码:如果UUID包含特殊字符,用[Uri]::EscapeUriString($subscriptionId)编码后再拼接URL
  • 复制Postman的请求头:在Postman中开启请求日志,把所有请求头完整复制到PowerShell的-Headers参数里,确保请求和Postman完全一致
  • 切换到Invoke-RestMethod:这个cmdlet专门针对REST API设计,处理请求头和响应解析更稳定,可以替换Invoke-WebRequest试试

内容的提问来源于stack exchange,提问作者vin_Bin87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:12:43