VB.NET使用HttpClient调用运营商短信Web API无报错但失效求助
问题分析与修复建议
代码中的核心问题
- JSON语法错误:手动拼接的
data2字符串里,多个属性的引号转义错误(比如msisdn:\"some number\"应为msisdn\":\"some number\"),导致JSON格式完全无效,API无法解析。 - 重复序列化JSON:
data2本身已是JSON字符串,却再次调用JsonConvert.SerializeObject,最终发送给API的是被二次转义的字符串,而非预期的JSON对象。 - 异步方法未等待:
PostAsync是异步方法,直接调用不使用Await会导致请求未完成就终止,实际未真正发送请求。 - 异常处理无效:
Catch块仅执行空的Console.WriteLine(),无法捕获和输出错误信息,排查无据。 - HttpClient未复用:每次点击新建
HttpClient实例,会造成系统socket资源耗尽,不符合最佳实践。
修正后的代码
' 在类级别声明复用的HttpClient实例 Private Shared ReadOnly _httpClient As New HttpClient() Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Try Dim url = "some url" ' 替换为运营商提供的实际API地址 ' 用匿名类构造请求数据,避免手动拼接JSON的语法错误 Dim requestData = New With { .username = "someuname", .password = "somepass", .msisdn = "some number", .content = "Hello, this is a sample broadcast", .shortcode_mask = "somemask" } ' 将匿名类序列化为标准JSON字符串 Dim payload = Newtonsoft.Json.JsonConvert.SerializeObject(requestData) Dim buffer = Encoding.UTF8.GetBytes(payload) Dim content = New Net.Http.ByteArrayContent(buffer) content.Headers.ContentType = New Net.Http.Headers.MediaTypeHeaderValue("application/json") ' 等待异步请求完成,确保请求正常发送 Dim response = Await _httpClient.PostAsync(url, content) ' 验证响应状态,主动抛出HTTP错误便于排查 response.EnsureSuccessStatusCode() Dim responseContent = Await response.Content.ReadAsStringAsync() Console.WriteLine("API响应内容:" & responseContent) Catch ex As Exception ' 输出完整异常信息,包含错误栈便于定位问题 Console.WriteLine("错误详情:" & ex.ToString()) End Try End Sub
额外排查建议
- 确认
url、msisdn、shortcode_mask等参数完全符合运营商API的格式要求(比如号码是否需带国家码)。 - 先用Postman等工具直接调用API,验证参数和地址的有效性,排除API本身或权限配置问题。
内容的提问来源于stack exchange,提问作者Serendipity
相关产品推荐
相关产品推荐

