向URL提交JSON数据时遇Error 401 Unauthorized,求排查方向
认证凭据与域配置检查
- 确认
_user和_password的正确性:检查是否有拼写错误、大小写不一致,或者服务器端是否已启用该账号的API访问权限。 - 修正NetworkCredential的domain参数:代码中传入的
"https://DOMAIN"是错误格式,domain应为纯域名(如example.com),若服务器不需要域认证,可直接留空:webClient.Credentials = New System.Net.NetworkCredential(_user, _password)
- 确认
匹配服务器要求的认证方式
- 若服务器采用Basic认证,仅设置NetworkCredential可能无效,需手动添加Authorization请求头:
Dim authStr As String = $"{_user}:{_password}" Dim authBytes As Byte() = Encoding.UTF8.GetBytes(authStr) webClient.Headers("Authorization") = $"Basic {Convert.ToBase64String(authBytes)}" - 务必确认服务器文档指定的认证类型(如Bearer Token、OAuth2等),若为Token认证,需替换Authorization头为对应的格式。
- 若服务器采用Basic认证,仅设置NetworkCredential可能无效,需手动添加Authorization请求头:
修复JSON数据的序列化错误
- 手动拼接的JSON存在语法错误:第一行末尾缺少逗号,正确拼接应为:
_json = "{ ""Dato"":""AAA""," - 代码中重复序列化JSON会导致格式错误:
JsonConvert.SerializeObject(_json)会将已有的JSON字符串再次转义,服务器无法解析。应直接将拼接好的JSON转为字节:reqString = Encoding.UTF8.GetBytes(_json) ' 优先使用UTF-8编码,符合API通用规范 - 建议改用类对象序列化生成JSON,避免手动拼接的语法错误:
Public Class RequestData Public Property Dato As String Public Property Comm As List(Of CommItem) End Class Public Class CommItem Public Property Code As String Public Property Descr As String End Class ' 使用时: Dim reqObj As New RequestData With { .Dato = "AAA", .Comm = New List(Of CommItem) From { New CommItem With {.Code = "1", .Descr = "Des1"} } } Dim _json As String = JsonConvert.SerializeObject(reqObj)
- 手动拼接的JSON存在语法错误:第一行末尾缺少逗号,正确拼接应为:
修正请求编码与冗余代码
- 删除多余的
reqString = System.Text.Encoding.Unicode.GetBytes(_json)代码,这行被后续代码覆盖,无实际作用。 - 替换
Encoding.Default为Encoding.UTF8,API接口通常要求UTF-8编码,避免编码不匹配导致的隐性错误。
- 删除多余的
服务器端权限验证
- 确认目标API端点
https://url/api/UpdateData是否对当前账号开放更新权限,服务器端是否存在权限配置错误。
- 确认目标API端点
内容的提问来源于stack exchange,提问作者LukaGer
相关产品推荐
相关产品推荐

