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

如何将curl命令转换为PowerShell Invoke-RestMethod并解决401未授权报错

问题排查与修正方案

核心错误原因

  • Content-Type不匹配:原curl的-d参数默认发送application/x-www-form-urlencoded格式的表单数据,你两次尝试要么发送JSON格式、要么未指定正确的表单编码类型,服务器无法识别请求体。
  • Basic认证重复编码:原curl请求中Authorization: Basic后面的sometoken1234567890已经是Base64编码后的凭证,你额外又做了一次Base64编码,导致凭证无效,直接触发401未授权错误。
  • 缺少SSL证书校验忽略逻辑:原curl的-k参数是跳过无效/自签名SSL证书校验,PowerShell默认会校验证书,如目标站点证书有问题也可能导致请求异常。
  • 参数使用错误:第二种写法中ContentType不应放在Headers数组里,而是Invoke-RestMethod的独立参数;且参数名拼写错误,应该是Headers不是Header。

正确写法

# 跳过SSL证书校验(对应原curl -k参数,仅测试环境使用,生产环境建议移除)
Add-Type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
    public bool CheckValidationResult(
        ServicePoint srvPoint, X509Certificate certificate,
        WebRequest request, int certificateProblem) {
        return true;
    }
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

# 构造请求参数
$headers = @{
    Authorization = "Basic sometoken1234567890" # 直接使用原curl中已编码的凭证,不需要再次Base64转换
    Accept = "application/json"
}

$body = @{
    grant_type = "client_credentials"
}

$params = @{
    Method = "Post"
    Uri = "https://api.vasttrafik.se:443/token"
    Headers = $headers
    Body = $body
    ContentType = "application/x-www-form-urlencoded" # 指定为表单编码格式
}

# 发起请求
$response = Invoke-RestMethod @params
# 输出返回的凭证信息
$response

补充说明

如果确认原curl中Basic后面的串是未编码的客户端ID:客户端密钥明文,才需要做Base64转换,转换逻辑如下:

$clientId = "你的客户端ID"
$clientSecret = "你的客户端密钥"
# OAuth2的client_credentials模式默认使用ASCII编码,不要用UTF8
$base64Auth = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("$($clientId):$($clientSecret)"))
$headers.Authorization = "Basic $base64Auth"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:36:07