首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用字符串在VB.net中创建Json,并在WebRequest中使用它

使用字符串在VB.net中创建Json,并在WebRequest中使用它
EN

Stack Overflow用户
提问于 2020-07-16 09:12:43
回答 1查看 5.8K关注 0票数 1

我试图在vb.net中调用vb.net,因此试图遵循文件/实例。下面的示例显示了以下代码作为工作示例:

代码语言:javascript
运行
复制
Sub Main(args As String())
    Dim request = TryCast(System.Net.WebRequest.Create("https://api.openrouteservice.org/v2/directions/driving-car/gpx"), System.Net.HttpWebRequest)

    request.Method = "POST"

    request.Accept = "application/json, application/geo+json, application/gpx+xml, img/png; charset=utf-8"
    request.Headers.Add("Authorization", "xxxxMYKEYxxxx")
    request.Headers.Add("Content-Type", "application/json; charset=utf-8")

    Using writer = New System.IO.StreamWriter(request.GetRequestStream())
        Dim byteArray As Byte() = System.Text.Encoding.UTF8.GetBytes({"coordinates:[[8.681495,49.41461],[8.686507,49.41943],[8.687872,49.420318]]"})
        request.ContentLength = byteArray.Length
        writer.Write(byteArray)
        writer.Close()
    End Using
    Dim responseContent As String
    Using response = TryCast(request.GetResponse(), System.Net.HttpWebResponse)
        Using reader = New System.IO.StreamReader(response.GetResponseStream())
            responseContent = reader.ReadToEnd()
            Console.WriteLine(responseContent.ToString())
        End Using
    End Using
End Sub

该示例表明,请求主体的内容应该如下:

代码语言:javascript
运行
复制
{"coordinates":[[8.681495,49.41461],[8.686507,49.41943],[8.687872,49.420318]]}

但是,在运行该示例时,我会得到以下错误:

代码语言:javascript
运行
复制
'The remote server returned an error: (500) Internal Server Error.'

因此,我认为请求失败是因为无效的Json。我的问题是如何创建与上面提供的示例- JSON相同的JSON?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-16 10:05:43

API期望有一个JSON对象,表示一个双值数组,作为HttpRequest的内容,编码为UTF-8字符串,作为字节数组发送。

此集合可以由List(Of List(Of Double)属性类型.Net类表示:

代码语言:javascript
运行
复制
' Note that JavaScriptSrializer might ignore <JsonProperty>,
' so use lower case, since the Web API is case-sensitive
Friend Class MyObject
    <JsonProperty("coordinates")>
    Public Property coordinates As List(Of List(Of Double))
End Class

在此之后,我们只需填写清单:

代码语言:javascript
运行
复制
Dim myobj = New MyObject() With {
    .Coordinates = New List(Of List(Of Double)) From {
        New List(Of Double)({8.681495, 49.41461}),
        New List(Of Double)({8.686507, 49.41943}),
        New List(Of Double)({8.687872, 49.420318})
    }
}

并使用Json.Net (通过NuGet包管理器安装NuGet包)或JavaScriptSerializer (或任何其他可用的JSON序列化程序)对其进行序列化:

JavaScriptSerializer需要对System.Web.Extension的项目引用并导入System.Web.Script.Serialization

代码语言:javascript
运行
复制
' Using Json.Net
Dim Json As String = JsonConvert.SerializeObject(myobj)

' Or JavaScriptSerializer
Dim json = New JavaScriptSerializer().Serialize(myobj)

►原始代码有多个问题:

  • webRequest.ContentLength设置得太晚了:它需要在发送请求之前设置
  • 用于写入StreamWriter流的WebRequest将危及进程:不需要它,并且在将字节写入请求流之前它将被关闭
  • 不能使用标头设置WebRequest.ContentType,必须使用Content-Type属性
  • 如果在Windows 7或WM中使用此代码,则添加SecurityProtocolType.Tls12 (在Windows 7中,默认为SecurityProtocolType.Ssl3 Or SecurityProtocolType.Tls,因此TLS1.0不再真正使用,此时TLS1.2仍然是主要参与者)

修正了原始代码,使用JavaScriptSerializer序列化请求数据:

如果使用Imports System.Web.Script.Serialization,则用Imports Newtonsoft.Json替换Json.Net。

代码语言:javascript
运行
复制
Imports System.IO
Imports System.Text
Imports System.Web.Script.Serialization

Dim myobj = New MyObject() With {
    .Coordinates = New List(Of List(Of Double)) From {
        New List(Of Double)({8.681495, 49.41461}),
        New List(Of Double)({8.686507, 49.41943}),
        New List(Of Double)({8.687872, 49.420318})
    }
}

Dim json As String = New JavaScriptSerializer().Serialize(myobj)

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
Dim request = WebRequest.CreateHttp("https://api.openrouteservice.org/v2/directions/driving-car/gpx")

request.Method = "POST"
request.PreAuthenticate = True
request.Accept = "application/json, application/geo+json, application/gpx+xml, img/png; charset=utf-8"
request.Headers.Add("Authorization", "[Your API Key]")
request.ContentType = "application/json; charset=utf-8"

Dim jsonBytes = Encoding.UTF8.GetBytes(json)
request.ContentLength = jsonBytes.Length
Using reqStream = request.GetRequestStream()
    reqStream.Write(jsonBytes, 0, jsonBytes.Length)
End Using

Dim responseContent As String = String.Empty
Using response = DirectCast(request.GetResponse(), HttpWebResponse),
    responseStream = response.GetResponseStream(),
    reader = New StreamReader(responseStream)
    responseContent = reader.ReadToEnd()
End Using
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62931337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档