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
相关产品推荐
相关产品推荐

