VB.NET中Web请求如何通过Newtonsoft.Json提取accessToken
提取API响应中的accessToken方法
先修正原代码中的请求错误
原代码里request.ContentLength = 0是错误的,服务器需要知道请求体的长度才能正确接收数据,应该改成:
request.ContentLength = bArray.Length
另外,建议用Using语句管理流对象,避免资源泄漏,原代码直接Close流的写法不够安全。
提取accessToken的两种实现方式
方式一:使用动态类型(无需定义实体类)
直接将响应JSON反序列化为动态对象,通过属性名直接获取accessToken:
Dim accessToken As String Dim body As String = "{""username"": ""abc"", ""password"": ""abc123""}" Dim request As WebRequest = WebRequest.Create("http://xxx.xxx.xxx.xxx/api/getaccessToken") request.Method = "POST" request.ContentType = "application/json" Dim bArray As Byte() = Encoding.UTF8.GetBytes(body) request.ContentLength = bArray.Length ' Using语句自动释放流资源 Using dStream As Stream = request.GetRequestStream() dStream.Write(bArray, 0, bArray.Length) End Using ' 处理响应 Using response As WebResponse = request.GetResponse() Using streamReader As New StreamReader(response.GetResponseStream()) Dim streamR = streamReader.ReadToEnd() ' 反序列化为动态对象 Dim jsonResponse = JsonConvert.DeserializeObject(Of Object)(streamR) ' 提取accessToken accessToken = jsonResponse("accessToken").ToString() End Using End Using Return accessToken
方式二:使用强类型实体类(更安全)
先定义和响应结构匹配的类,再反序列化,这种方式在编译期就能检查属性名是否正确,避免运行时错误:
' 定义响应实体类 Public Class TokenResponse Public Property accessToken As String Public Property expires As String End Class ' 主代码部分 Dim accessToken As String Dim body As String = "{""username"": ""abc"", ""password"": ""abc123""}" Dim request As WebRequest = WebRequest.Create("http://xxx.xxx.xxx.xxx/api/getaccessToken") request.Method = "POST" request.ContentType = "application/json" Dim bArray As Byte() = Encoding.UTF8.GetBytes(body) request.ContentLength = bArray.Length Using dStream As Stream = request.GetRequestStream() dStream.Write(bArray, 0, bArray.Length) End Using Using response As WebResponse = request.GetResponse() Using streamReader As New StreamReader(response.GetResponseStream()) Dim streamR = streamReader.ReadToEnd() ' 反序列化为强类型对象 Dim tokenResponse = JsonConvert.DeserializeObject(Of TokenResponse)(streamR) ' 直接获取属性值 accessToken = tokenResponse.accessToken End Using End Using Return accessToken
内容的提问来源于stack exchange,提问作者user19613128
相关产品推荐
相关产品推荐

