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

VB.NET调用带Bearer Token及请求体的Web API报错问题排查

问题根因

两个报错来自三处代码与Postman配置、框架规则的不匹配:

  • HTTP方法不匹配:Postman中该接口配置的请求方法为GET,代码中设置POST时服务端直接返回405 Method Not Allowed,说明目标路径不支持POST请求
  • .NET Framework默认拦截带请求体的GET请求:HTTP规范本身不建议GET请求携带Body,因此HttpWebRequest默认禁止GET请求调用GetRequestStream()写入内容,直接抛出"Cannot send the content body with this verb-type"异常,Postman属于非标准实现,不受该规则限制
  • 基础配置错误:
    • 未正确初始化请求对象:原代码直接CType(url, HttpWebRequest)属于类型转换错误,必须通过WebRequest.Create(url)创建请求实例
    • Authorization头配置错误:代码中AuthorizationX变量未定义,Bearer Token的正确头格式为Authorization: Bearer <token值>
    • ContentType值错误:Postman中Raw Text对应的MIME类型为text/plain,原代码写的text是无效值
修复实现

方案1:完全对齐Postman配置(支持GET携带请求体)

通过反射解除HttpWebRequest对GET请求发送Body的限制,代码可直接运行:

' 代码文件顶部需导入对应命名空间
' Imports System.IO
' Imports System.Net
' Imports System.Reflection
' Imports System.Text

Sub Test()
    Dim json As String = File.ReadAllText("C:\para.json")
    Dim token As String = "549539487523948576293485629384756293847"
    Dim apiUrl As String = "替换为实际API请求地址"
    Dim result As String

    ' 初始化请求
    Dim request = CType(WebRequest.Create(apiUrl), HttpWebRequest)
    ' 反射修改内部方法标记,允许GET发送Body
    Dim requestType = GetType(HttpWebRequest)
    Dim setMethod = requestType.GetMethod("SetHttpMethod", BindingFlags.Instance Or BindingFlags.NonPublic)
    setMethod.Invoke(request, {"GET"})
    request.Method = "GET"
    ' 配置请求头
    request.ContentType = "text/plain"
    request.Headers.Add("Authorization", $"Bearer {token}")

    ' 写入请求体
    Using sw As New StreamWriter(request.GetRequestStream(), Encoding.UTF8)
        sw.Write(json)
    End Using

    ' 读取响应
    Try
        Dim resp = CType(request.GetResponse(), HttpWebResponse)
        Using sr As New StreamReader(resp.GetResponseStream(), Encoding.UTF8)
            result = sr.ReadToEnd()
        End Using
        ' 此处添加result的后续处理逻辑
    Catch ex As WebException
        ' 捕获错误响应,方便排查问题
        Dim errResp = CType(ex.Response, HttpWebResponse)
        Using sr As New StreamReader(errResp.GetResponseStream(), Encoding.UTF8)
            Dim errMsg = sr.ReadToEnd()
            ' 打印errMsg可查看服务端返回的详细错误信息
        End Using
    End Try
End Sub

方案2:改用POST请求(需和API提供方确认支持)

带请求体的GET不符合HTTP标准,若接口实际支持POST,可直接用更规范的POST实现,无需反射修改框架配置:

' 代码文件顶部需导入对应命名空间
' Imports System.IO
' Imports System.Net
' Imports System.Text

Sub Test()
    Dim json As String = File.ReadAllText("C:\para.json")
    Dim token As String = "549539487523948576293485629384756293847"
    Dim apiUrl As String = "替换为实际API请求地址"
    Dim result As String

    Dim request = CType(WebRequest.Create(apiUrl), HttpWebRequest)
    request.Method = "POST"
    request.ContentType = "text/plain"
    request.Headers.Add("Authorization", $"Bearer {token}")

    Using sw As New StreamWriter(request.GetRequestStream(), Encoding.UTF8)
        sw.Write(json)
    End Using

    Try
        Dim resp = CType(request.GetResponse(), HttpWebResponse)
        Using sr As New StreamReader(resp.GetResponseStream(), Encoding.UTF8)
            result = sr.ReadToEnd()
        End Using
    Catch ex As WebException
        Dim errResp = CType(ex.Response, HttpWebResponse)
        Using sr As New StreamReader(errResp.GetResponseStream(), Encoding.UTF8)
            Dim errMsg = sr.ReadToEnd()
        End Using
    End Try
End Sub
排查提示
  • 运行前确认代码中填写的API地址、Token值与Postman中完全一致,无多余空格、拼写错误
  • 若返回401/403错误,优先检查Authorization头格式,Bearer前缀和Token值之间必须有半角空格
  • 优先和API提供方确认接口规范:绝大多数公开/内部API不会采用带Body的GET设计,建议先核对Postman配置是否存在方法选择错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:15:46