Web API 从 VB.NET 中的另一个 API 接收 XML
Web API Receive XML from another API in VB.NET
我是 Web api 的新手,但对 VB.NET 的网站开发有很深的了解。我正在尝试构建一个 api,它将从另一个 api 接收 xml。我在我的域中设置了初始 Web api 框架。我只需要知道使用什么函数来接受和使用 xml 另一个 api 正在 posting 到我的新 api。正在传递的 xml 如下所示。我试图将这些存储到变量中,我将在收到它们后 post 到我的 table。
任何帮助都将非常有用,因为我花了几天时间进行研究,但无法完全搜索正确的术语来找到我要找的东西。预先感谢您的任何回复。
示例 xml 从外部 posted API
<exAPI>
<client>
<id>1</id>
<key>1234</key>
<ref></ref>
</client>
</exAPI>
您至少有 2 个选择。
但首先您需要创建一个 class 模型来代表您的 XML。它可能看起来像这样:
[XmlRoot("exAPI", Namespace = "")]
public class ExApi
{
[XmlElement("client")]
public Client Client { get; set; }
}
public class Client
{
[XmlElement("id")]
public int Id { get; set; }
[XmlElement("key")]
public string Key { get; set; }
[XmlElement("ref")]
public string Ref { get; set; }
}
自动参数绑定。要使此方法起作用,您需要检查来自外部的请求中是否存在 Content-Type: application/xml
HTTP headerAPI.这也可以是Content-Type: text/xml
。如果是,您将需要更改 XmlFormatter
。默认情况下 Web API 使用 DataContractSerializer
但反序列化您的 XML 将非常困难。只需将此代码添加到您的 Global.asax
Application_Start
方法中:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
你的控制器方法可能看起来像这样:
public void Post(ExApi exApi)
{
// XML is automatically deserialized in exApi parameter
}
您可以在 this article and about custom XML serialization in this one 中阅读有关参数绑定的更多信息。
从请求 获取原始 XML 数据。如果缺少 Content-Type
header 那么您将需要手动读取请求的内容,然后解析 XML:
public void Post(HttpRequestMessage req)
{
using (var xml = req.Content.ReadAsStreamAsync().Result)
{
var deserializer = new XmlSerializer(typeof (ExApi));
using (var xmlReader = XmlReader.Create(xml))
{
var obj = (ExApi)deserializer.Deserialize(xmlReader);
}
}
}
请注意,方法参数是 HttpRequestMessage
类型,它允许您读取请求的内容。
注意: 抱歉,它不是 VB.NET,但我认为您会设法从 C# 转换它。
为了补充这个问题的答案,这里有一些用于在 VB.NET 中进行 REST GET 调用的代码:
Private Function GetREST(ByVal Name As String) As String
Dim content As String = Nothing
Using client As New System.Net.Http.HttpClient
Dim url As String = "http://some-rest.url/something/endpoint?arg1=val1&arg2=val2"
Using request As New System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url)
Using response As System.Net.Http.HttpResponseMessage = client.SendAsync(request).Result
If response.IsSuccessStatusCode Then
Dim task As System.Threading.Tasks.Task(Of System.IO.Stream) = response.Content.ReadAsStreamAsync()
task.ContinueWith(Sub()
Dim result As String
Dim s As System.IO.Stream = task.Result
Using sr As New System.IO.StreamReader(s)
result = sr.ReadToEnd()
End Using
content = result
End Sub
).Wait()
End If
End Using
End Using
End Using
Return content
End Function
无法在其他地方找到 VB.NET 样本。
我是 Web api 的新手,但对 VB.NET 的网站开发有很深的了解。我正在尝试构建一个 api,它将从另一个 api 接收 xml。我在我的域中设置了初始 Web api 框架。我只需要知道使用什么函数来接受和使用 xml 另一个 api 正在 posting 到我的新 api。正在传递的 xml 如下所示。我试图将这些存储到变量中,我将在收到它们后 post 到我的 table。
任何帮助都将非常有用,因为我花了几天时间进行研究,但无法完全搜索正确的术语来找到我要找的东西。预先感谢您的任何回复。
示例 xml 从外部 posted API
<exAPI>
<client>
<id>1</id>
<key>1234</key>
<ref></ref>
</client>
</exAPI>
您至少有 2 个选择。
但首先您需要创建一个 class 模型来代表您的 XML。它可能看起来像这样:
[XmlRoot("exAPI", Namespace = "")]
public class ExApi
{
[XmlElement("client")]
public Client Client { get; set; }
}
public class Client
{
[XmlElement("id")]
public int Id { get; set; }
[XmlElement("key")]
public string Key { get; set; }
[XmlElement("ref")]
public string Ref { get; set; }
}
自动参数绑定。要使此方法起作用,您需要检查来自外部的请求中是否存在 Content-Type: application/xml
HTTP headerAPI.这也可以是Content-Type: text/xml
。如果是,您将需要更改 XmlFormatter
。默认情况下 Web API 使用 DataContractSerializer
但反序列化您的 XML 将非常困难。只需将此代码添加到您的 Global.asax
Application_Start
方法中:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
你的控制器方法可能看起来像这样:
public void Post(ExApi exApi)
{
// XML is automatically deserialized in exApi parameter
}
您可以在 this article and about custom XML serialization in this one 中阅读有关参数绑定的更多信息。
从请求 获取原始 XML 数据。如果缺少 Content-Type
header 那么您将需要手动读取请求的内容,然后解析 XML:
public void Post(HttpRequestMessage req)
{
using (var xml = req.Content.ReadAsStreamAsync().Result)
{
var deserializer = new XmlSerializer(typeof (ExApi));
using (var xmlReader = XmlReader.Create(xml))
{
var obj = (ExApi)deserializer.Deserialize(xmlReader);
}
}
}
请注意,方法参数是 HttpRequestMessage
类型,它允许您读取请求的内容。
注意: 抱歉,它不是 VB.NET,但我认为您会设法从 C# 转换它。
为了补充这个问题的答案,这里有一些用于在 VB.NET 中进行 REST GET 调用的代码:
Private Function GetREST(ByVal Name As String) As String
Dim content As String = Nothing
Using client As New System.Net.Http.HttpClient
Dim url As String = "http://some-rest.url/something/endpoint?arg1=val1&arg2=val2"
Using request As New System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url)
Using response As System.Net.Http.HttpResponseMessage = client.SendAsync(request).Result
If response.IsSuccessStatusCode Then
Dim task As System.Threading.Tasks.Task(Of System.IO.Stream) = response.Content.ReadAsStreamAsync()
task.ContinueWith(Sub()
Dim result As String
Dim s As System.IO.Stream = task.Result
Using sr As New System.IO.StreamReader(s)
result = sr.ReadToEnd()
End Using
content = result
End Sub
).Wait()
End If
End Using
End Using
End Using
Return content
End Function
无法在其他地方找到 VB.NET 样本。