Web API从VB.NET中的另一个API接收XML

时间:2015-03-26 11:58:01

标签: xml asp.net-mvc vb.net api asp.net-web-api

我是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>

2 个答案:

答案 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示例。