我是web api的新手,但对网站开发有很强的VB.NET知识。我正在尝试构建一个api,它将从另一个api接收xml。我使用最初的web api框架设置了我的域名。我只需要知道用什么函数来接受和使用xml,其他api发布到我的新api。传递的xml如下所示。我试图将这些存储到变量中,我会在收到它们后发布到我的表中。
任何有关这方面的帮助都会很棒,因为我花了几天的时间研究,但却找不到合适的术语来找到我正在寻找的东西。提前感谢任何回复。
从外部API发布的示例xml
<exAPI>
<client>
<id>1</id>
<key>1234</key>
<ref></ref>
</client>
</exAPI>
答案 0 :(得分:1)
至少有两个选项可供选择。
但首先你需要创建一个代表你的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; }
}
自动参数绑定。要使此方法起作用,您需要检查来自外部API的请求中是否存在Content-Type: application/xml
HTTP标头。这也可以是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中阅读有关参数绑定的更多信息,并在this one中了解有关自定义XML序列化的信息。
从请求中获取原始XML数据。如果缺少Content-Type
标头,则需要手动读取请求的内容,然后解析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);
}
}
}
请注意,method参数的类型为HttpRequestMessage
,允许您读取请求的内容。
注意:对不起,这不是VB.NET,但我认为你会设法从C#转换它。
答案 1 :(得分:0)
要添加答案,这里有一些用于在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示例。